2013-02-22 3 views
1

Я обнаружил, в чем проблема: это не имеет никакого отношения к самому C# -коду, но это в XAML вместо этого. Проблема была в цветах по умолчанию, которые у меня есть установленные в XAML, переоценивали цвета моего стиля.Невозможно применить стиль в WPF с помощью кода C#

Итак, когда вы устанавливаете какое-либо свойство XAML, он всегда переопределяет более поздние стили, заданные кодом C# во время выполнения, это кажется мне странным, но по крайней мере так оно и было для меня.

+0

Стили должны быть созданы в XAML. И применяется также в XAML. Зачем заполнять codeBehind непонятными вещами. Попробуйте увидеть шаблон MVVM для WPF. http://csharperimage.jeremylikness.com/2010/04/model-view-viewmodel-mvvm-explained.html Вы заметите, что использование стиля в окне (или другом UserControl) не является хорошей практикой, конструктор. – meorfi

+0

Кроме того, вот хороший учебник, который научит вас, как правильно создавать и использовать стили. http://www.wpftutorial.net/ :) BTW, в будущем вы никогда не создадите стили с C# .. Вы будете использовать шаблоны XAML (Стили или другие ресурсы) – meorfi

+1

Зачем использовать C# вместо XAML для стилизации? Есть причина. Но я не могу описать здесь почему, в ограниченном комментарии из 500 символов. В общем, мне не нравится механизм XAML, но есть и много технических причин. – Lispwave

ответ

1

Настройки по умолчанию цвет фона в коде XAML избегали стиль С # 's применять на панелях (По-крайней мере, избежать новой Background быть применены более, используемого по умолчанию).

0

Вы не разместили создание своего стиля, возможно, там что-то не хватает?

Существует another similar answer на StackOverflow, который является очень хорошим и короткий пример создания и настройки стиля в коде:

Q: Кто-нибудь знает, как создать МОФ стиль в коде позади, я не могут найти что-либо в Интернете или документах MSDN. Я попытался это, но он не работает:

A: Вам нужно добавить сеттеры в стиле, а не использовать RegisterName. Следующий код в событии Window_Loaded создаст новый стиль TextBlock, который станет стандартным для всех экземпляров TextBlock в окне. Если вы предпочитаете явно устанавливать его на одном конкретном TextBlock, вы можете установить свойство Style этого элемента управления, а не добавлять стиль в словарь ресурсов.

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    Style style = new Style(typeof (TextBlock)); 
    style.Setters.Add(new Setter(TextBlock.ForegroundProperty, Brushes.Green)); 
    style.Setters.Add(new Setter(TextBlock.TextProperty, "Green")); 
    Resources.Add(typeof (TextBlock), style); 
} 
0

Я использовал ваш код и немного модифицировал для проверки. Кажется, работает нормально. Посмотрите:

Style Style_Panel = new Style(typeof(Panel)); 

     public void Init_Style() 
     { 
      // Create Styles : 
      #region "Create Styles" 

      Style_Panel.Setters.Add(new Setter() 
      { 
       Property = Panel.BackgroundProperty, 
       Value = new SolidColorBrush(Colors.Red) 
      }); 
      Resources.Add(Style_Panel.TargetType, Style_Panel); 

      #endregion 

      // Apply Styles : 
      #region "Apply Styles" 

      List<Visual> List_Visual = new List<Visual>(); 
      List_Visual.Add(new StackPanel() { Name = "btn" }); 
      //Enum_Visual(Panel_Main, List_Visual); 
      foreach (Visual visual in List_Visual) 
      { 
       if (visual is Panel) 
       { 
        Panel panel = visual as Panel; 
        //if (Tagged(panel, "titlebar")) 
        //{ 

        //} 
        //else if (Tagged(panel) == false) 
        { 
         // panel.Background = new SolidColorBrush(Colors.Red); // <- WORKS . 
         panel.Style = Style_Panel; // <- DOES NOT WORKS ! 
        } 
       } 
      } 

      #endregion 
     } 
+0

Эй, спасибо за попытку, Но я обнаружил, что проблема не в моем коде на C# даже. Это в коде XAML, After я удалил цвета по умолчанию для каждой панели. Новые стили были применены к ним правильно, так что красный цвет был замечен. Но вдруг события каждой панели не будут работать. Как MouseDown. Возможно, это потому, что у них нет фона так что вы не можете на самом деле нажать на них. Я не знаю, что я проверю. Я все еще не понимаю, почему цвета по умолчанию в XAML избегают стилей, применяемых над ними. – Lispwave

+0

Так работает свойство зависимостей. Значение, исходящее от стиля, будет переопределено значением, заданным вами напрямую. Прочтите это http://msdn.microsoft.com/en-us/library/ms743230.aspx – Manish

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