1

如何在代码中设置样式的属性值?我有一个资源字典,我想更改代码中的一些属性,我该怎么做?

wpf代码:

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Style
        x:Key="ButtonKeyStyle"
        TargetType="{x:Type Button}">

        <Setter Property="Width" Value="{Binding MyWidth}"/>
        ....

C#代码:

Button bt_key = new Button();
bt_key.SetResourceReference(Control.StyleProperty, "ButtonKeyStyle");
var setter = new Setter(Button.WidthProperty, new Binding("MyWidth"));
setter.Value = 100;
...

我做错了什么?

4

2 回答 2

1

您还没有解释运行代码时发生了什么(或没有发生)。但是,您发布的代码正在创建一个new Setter(...)但不会显示您正在使用它做什么。您需要将创建的 setter 添加到样式中才能生效。

但是,您所引用的样式的 Xaml 中已经有一个宽度属性的设置器。所以,我怀疑你实际上想要编辑现有的 setter 而不是创建一个新的。

于 2013-03-11T09:40:44.060 回答
0

为什么不在 XAML 中创建按钮,然后INotifyPropertyChanged在代码中实现 -Interface 并为“MyWidth”创建一个属性?它可能看起来像这样:

XAML:

<Button Name="MyButton" Width="{Bindind Path=MyWidth}" />

视图模型/代码隐藏:

// This is your private variable and its public property
private double _myWidth;
public double MyWidth
{
    get { return _myWidth; }
    set { SetField(ref _myWidth, value, "MyWidth"); } // You could use "set { _myWidth = value; RaisePropertyChanged("MyWidth"); }", but this is cleaner. See SetField<T>() method below.
}

// Feel free to add as much properties as you need and bind them. Examples:
private double _myHeight;
public double MyHeight
{
    get { return _myHeight; }
    set { SetField(ref _myHeight, value, "MyHeight"); }
}

private string _myText;
public double MyText
{
    get { return _myText; }
    set { SetField(ref _myText, value, "MyText"); }
}

// This is the implementation of INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(String propertyName)
{
    if (PropertyChanged != null)
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}

// Prevents your code from accidentially running into an infinite loop in certain cases
protected bool SetField<T>(ref T field, T value, string propertyName)
{
    if (EqualityComparer<T>.Default.Equals(field, value))
            return false;

    field = value;
    RaisePropertyChanged(propertyName);
    return true;
}

然后,您可以将按钮的宽度属性绑定到此“MyWidth”属性,每次您在代码中设置“MyWidth”时它都会自动更新。您需要设置属性,而不是私有变量本身。否则它不会触发它的更新事件,你的按钮也不会改变。

于 2013-03-11T11:15:36.457 回答