2017-02-05 7 views
0

私は単一のウィンドウwpfアプリケーションを持っており、すべてのTextBoxコントロールに適用するウィンドウ全体のスタイルを設定しようとしました。私はTextBlockコントロールで期待どおりに動作している別のスタイルを持っていますが、何らかの理由でTextBoxスタイルはx:Keyを使用するときにのみ機能します。私はこのスタイルを私のウィンドウ内のすべてのTextBoxのためのグローバルにしようとしています。ウィンドウ全体のテキストボックススタイルが適用されないのはなぜですか?

境界線の太さ、前景、背景、TextWeightなど、私のTextBoxスタイルで複数のプロパティを試したことに注意する必要があります。キーが押されない限り、TextBoxコントロールごとに明示的にスタイルが定義されます。

このコードブロックは現在私のApp.xamlにありますが、Window.Resourcesの下でもテストしました。あなたは、ウィンドウ全体のリソースのスタイルを定義するときにキーを削除する必要があるのStackPanel

<StackPanel Orientation="Horizontal"> 
      <StackPanel.Resources> 
       <Style TargetType="{x:Type TextBox}"> 
        <Setter Property="Margin" Value="10,0,10,0"/> 
       </Style> 
      </StackPanel.Resources> 
      <TextBlock>Part Width:</TextBlock> 
      <TextBox Name="partWidthTextBox" Text="{Binding Path=Layout.Part.Width, UpdateSourceTrigger=LostFocus}" Style="{StaticResource TextBoxStyle}" Width="50" > 
      </TextBox> 
      <TextBlock>Part Height:</TextBlock> 
      <TextBox Name="partHeightTextBox" Text="{Binding Path=Layout.Part.Height, UpdateSourceTrigger=LostFocus}" Style="{StaticResource TextBoxStyle}" Width="50" /> 
     </StackPanel> 
+0

これら2つのスタイルはどこに定義されていますか? – Yarik

+0

これは、App.xamlの "Application.Resources"の内部にコードを配置するときに機能します。任意のフォームに配置されたすべてのテキストボックスは赤い背景を持っています。あなたに適していない完全な例を提供してください。 – NineBerry

+0

さて、TextboxのXAMLを教えてください。 – NineBerry

答えて

0

<ResourceDictionary> 
    <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" xmlns:vm="clr-namespace:GraphicalNestingCalculator.ViewModel" /> 
    <Style TargetType="{x:Type TextBlock}"> 
     <Setter Property="Foreground" Value="Blue"/> 
    </Style> 
    <Style x:Key="TextBoxStyle" TargetType="{x:Type TextBox}"> 
     <Setter Property="Background" Value="Red"/> 
    </Style> 
</ResourceDictionary> 

そしてテキストボックス、そうでなければ、明示的に参照する必要があります後で

</Style> 
<Style TargetType="TextBox"> 
    <Setter Property="Background" Value="Red"/> 
</Style> 
(既に他の回答のように)

とにかく:

編集

あなたはより具体的なスタイルを適用したい場合は、より具体的なものが広い一つのウィンドウに基づくべき、のStackPanelの子供のための設定マージンの要件だけ TextBoxのためのより多くのジェネリックすることができるので、代わりにスタイルのattached propertyを持つ別のオプションもあります

<StackPanel Orientation="Horizontal" local:MarginSetter.Margin="10"> 

マージンのための最後の一般的な解決策は、しかし、より複雑である - ロードされるパネルの子供のための - あなたは両方をしたい場合、私は次のイベント

private void StackPanel_Loaded(object sender, RoutedEventArgs e) 
    { 
     MarginSetter.CreateThicknesForChildren(sender, new DependencyPropertyChangedEventArgs()); 
    } 
1

を購読したいですXなしの暗黙のスタイル:キーとあなたが後者に前者をベースにする必要があり適用するあなたのApp.xamlまたは<Window.Resources>で定義どのようなスタイル:

<StackPanel Orientation="Horizontal"> 
    <StackPanel.Resources> 
     <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}"> 
      <Setter Property="Margin" Value="10,0,10,0"/> 
      <Setter Property="FontSize" Value="40" /> 
     </Style> 
    </StackPanel.Resources> 
    <TextBlock>Part Width:</TextBlock> 
    <TextBox Name="partWidthTextBox" Text="{Binding Path=Layout.Part.Width, UpdateSourceTrigger=LostFocus}" Width="50" > 
    </TextBox> 
    <TextBlock>Part Height:</TextBlock> 
    <TextBox Name="partHeightTextBox" Text="{Binding Path=Layout.Part.Height, UpdateSourceTrigger=LostFocus}" Width="50" /> 
</StackPanel> 

App.xaml:あなたはテキストボックスにStyle="{StaticResource TextBoxStyle}"を設定すると

<ResourceDictionary> 
    <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" xmlns:vm="clr-namespace:GraphicalNestingCalculator.ViewModel" /> 
    <Style TargetType="{x:Type TextBlock}"> 
     <Setter Property="Foreground" Value="Blue"/> 
    </Style> 
    <Style TargetType="{x:Type TextBox}"> 
     <Setter Property="Background" Value="Red"/> 
    </Style> 
</ResourceDictionary> 

あなたは<StackPanel.Resources>に定義する暗黙のスタイルは無視されます。これは予想される動作です。

関連する問題