18

ユーザーが WPF アプリケーションの要素をカスタマイズできるようにしようとしています。私が達成しようとしているのは、すべてのフォーム要素 (TextBox、ラベルなど) を指定するリスト ボックスがある場合、ユーザーは 1 つのフォーム要素を選択し、スタイル プロパティを設定して Label と言うことができます。前景はオレンジ色にする必要があります。 TextBox の前景は黒などにする必要があります。そして、私が適用しようとしているスタイルに応じて、すべての TextBoxes は似ているはずです。

これを達成する方法を見つけることができません。複数の定義済みスタイルを実行時にアップロードできる例を試しました。そこで、実行時にさまざまな要素のプロパティを変更する方法を見つけたいと思います。

UPDATE:

コード ビハインドから新しいスタイルを作成しようとしました。

XAML

<Label Content="SAMPLE" Style="{DynamicResource Style1}" x:Name="label1" />
<Button Content="Button" Click="Button_Click" />

そしてコードビハインド、つまりボタンをクリックすると、これを試しました:

Style style = new Style { TargetType = typeof(Label) };
style.Setters.Add(new Setter(Control.ForegroundProperty, Brushes.Black));
Application.Current.Resources["Style1"] = style;

しかし、それは更新されていません。

ありがとう。

4

3 に答える 3

33

スタイルがファイルにあることを確認する必要がありますApp.xaml

<Application x:Class="ChangeStyleHelp.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         StartupUri="MainWindow.xaml">

    <Application.Resources>
        <Style x:Key="MyStyle" TargetType="{x:Type Label}">
            <Setter Property="Background" Value="Green" />
        </Style>
    </Application.Resources>
</Application>

コードビハインド:

private void ChangeStyle_Click(object sender, RoutedEventArgs e)
{
    Style style = new Style 
    { 
        TargetType = typeof(Label) 
    };

    style.Setters.Add(new Setter(Label.BackgroundProperty, Brushes.Aquamarine));

    Application.Current.Resources["MyStyle"] = style;
}   

が( )Styleのリソースにある場合は、 、または の名前を記述する必要があります。WindowWindow.ResourcesthisWindow

private void ChangeStyle_Click(object sender, RoutedEventArgs e)
{
    Style style = new Style 
    { 
        TargetType = typeof(Label) 
    };

    style.Setters.Add(new Setter(Label.BackgroundProperty, Brushes.Aquamarine));

    this.Resources["MyStyle"] = style;
}   

同様に、Styleこの方法を変更することもできます: 既存のスタイルを取り、要素を使用します。例:

<Application x:Class="ChangeStyleHelp.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         StartupUri="MainWindow.xaml">

    <Application.Resources>
        <Style x:Key="AnotherWayStyle" TargetType="{x:Type Label}">
            <Setter Property="Background" Value="Lavender" />
            <Setter Property="Foreground" Value="OrangeRed" />
        </Style>
    </Application.Resources>
</Application>  

コードビハインド:

private void AnotherWay_Click(object sender, RoutedEventArgs e)
{
    label1.Style = (Style)Application.Current.Resources["AnotherWayStyle"];
}   
于 2013-08-13T05:40:19.050 に答える
6

リソース ディクショナリを使用してみましたか

リソース ディクショナリ

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<SolidColorBrush x:Key="TextColor" Color="#FF121212"/>
</ResourceDictionary>

コントロールの XAML

<TextBox Text="TextBox" Foreground="{DynamicResource TextColor}" />

実行時にスタイルを変更するコード

     var rd = new ResourceDictionary();
     rd.Add("TextColor", "#FFFFFF");
     Application.Current.Resources.MergedDictionaries.Add(rd);

これにより、新しいスタイルが既存のスタイルとマージされ、それらのスタイルにリンクされているすべてのコントロールに変更が自動的に反映されます。

于 2013-08-13T05:27:28.083 に答える
1

それは私にとって魅力のように機能しました:

Xaml:

<TreeView x:Name="TreePeople">
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="IsExpanded" Value="True" />
        </Style>
    </TreeView.ItemContainerStyle>
</TreeView> 

c#:

bool Expanded = false; 
// The event subscription method (for a button click)
private void ButtonExpand__Click(object sender, RoutedEventArgs e)
{
    Expanded = !Expanded;
    Style Style = new Style
    {
        TargetType = typeof(TreeViewItem)
    };

    Style.Setters.Add(new Setter(TreeViewItem.IsExpandedProperty, Expanded));
    TreePeople.ItemContainerStyle = Style;
}
于 2014-06-04T18:37:28.610 に答える