2013-03-11 4 views
1

Как установить значение свойства стиля в коде? У меня есть resourcedictionary, и я хочу изменить некоторое свойство в коде, как я это делаю?Как установить значение свойства в коде?

код МОФ:

<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; 
... 

то, что я делаю неправильно?

+0

Хм, что случилось? Какова ваша текущая реализация, так что вы не удовлетворены? – DHN

ответ

1

Вы не объяснили, что происходит (или нет), когда вы запускаете свой код. Однако код, который вы опубликовали, создает new Setter(...), но затем не показывает, что вы делаете с ним. Вам нужно будет добавить созданный сеттер в стиль, чтобы он мог действовать.

Однако для свойства width в Xaml уже существует сеттер стиля, на который вы ссылаетесь. Поэтому я подозреваю, что вы действительно хотите изменить существующий сеттер, а не создавать новый.

+0

я просто хочу, чтобы изменить значение ширины собственности, в том же resourcedicionary У меня есть TextBlock и изменить текст, так что: Кодекса МОФ:

+0

Выполнение, как я уже сказал, не меняет ширины и устанавливает максимальный контейнер –

0

Почему бы вам не создать кнопку в вашем XAML, а затем реализовать объект INotifyPropertyChanged -Interface и создать свойство для «MyWidth» внутри вашего кода? Это может выглядеть следующим образом:

XAML:

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

ViewModel/Codebehind:

// 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; 
} 

Вы можете связать Width-свойство вашей кнопки для этого -свойстве "MyWidth", и будет автоматически обновляться каждый раз, когда вы устанавливаете «MyWidth» в своем коде. Вам нужно установить свойство, а не собственную переменную. В противном случае он не будет запускать свое событие обновления, и ваша кнопка не изменится.

+0

Это не сработает легко, если этот стиль используется совместно с приложением - вам придется передать тот же экземпляр любого класса, реализующего это свойство вокруг каждого окна (или потенциально UserControl) в приложении или подвергать его статическому. –

Смежные вопросы