2013-02-22 93 views
1

我发现问题是什么,它与C#代码本身无关,但它在XAML中,而不是问题是我默认的颜色在XAML中设置重写我的风格的颜色。因此总而言之,当您通过XAML设置任何属性时,它总是会覆盖稍后在运行时由C#代码设置的样式,这对我来说似乎很奇怪,但至少这是它对我的工作原理。无法在WPF中通过C#代码应用样式

+0

样式应该在XAML中创建。并且也应用于XAML。为什么要用无用的东西填充代码后面。尝试在MVVM模式中查看WPF。 http://csharperimage.jeremylikness.com/2010/04/model-view-viewmodel-mvvm-explained.html 您会注意到,在Window(或其他UserControl)中使用样式并不是一种好的做法,构造函数。 – meorfi 2013-02-22 07:24:31

+0

此外,这里是一个很好的教程,它将教你如何以正确的方式创建和使用样式。 http://www.wpftutorial.net/ :)顺便说一下,将来你永远不会用C#创建样式。你将使用XAML模板(STYLES或其他资源) – meorfi 2013-02-22 07:27:40

+1

为什么使用C#而不是XAML进行样式设计?有一个原因,但我不能在这里描述为什么,在500个字符的有限评论。一般来说,我不喜欢XAML机制,但也有许多技术原因。 – Lispwave 2013-02-22 07:51:07

回答

1

默认的背景颜色避免的C#的风格运用在面板(AT-至少避免在默认设置会被应用在新Background)。

0

你还没有发布你的风格的创作,也许有什么缺失吗?

another similar answer在计算器上是创造和代码设置风格的一个很好的和简单的例子:

问:有谁知道怎么后面在代码中创建一个WPF的风格,我无法在网络或MSDN文档上找到任何内容。我曾经试过,但它不工作:

答:您需要制定者添加到样式,而不是使用RegisterName。以下代码在Window_Loaded事件中将创建一个新的TextBlock样式,该样式将成为窗口内TextBlock所有实例的默认样式。如果您希望将其明确地设置为一个特定的TextBlock,则可以设置该控件的Style属性,而不是将该样式添加到Resources字典中。

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

我用你的代码和修改的一点点进行验证。似乎工作正常。看一看:

在XAML代码
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代码后,我没有删除的每个面板的默认颜色,适用于他们的新的风格也是正确的红色看到,但突然的每个面板的活动将无法正常工作像鼠标按下,也许是因为他们没有背景所以你不能真的按他们..我不知道我会检查出来。我仍然不明白为什么XAML中的默认颜色避免应用于它们的样式。 – Lispwave 2013-02-22 07:35:41

+0

这是依赖项属性的工作方式。来自Style的值将被您直接设置的值覆盖。阅读http://msdn.microsoft.com/en-us/library/ms743230.aspx – Manish 2013-02-22 08:42:13