2013-02-22 58 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