2011-03-25 144 views
4

我做了一個非常簡單的測試項目:忽略元數據覆蓋?

MainWindow.xaml:

<Window x:Class="Test.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:Test" 
     Title="MainWindow" Height="350" Width="525" VerticalAlignment="Center" HorizontalAlignment="Center"> 

    <StackPanel x:Name="mainPanel" /> 

</Window> 

MainWindow.xaml.cs:

using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Media; 

namespace Test 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
     InitializeComponent(); 

      MyTextBox myTextBox = new MyTextBox("some text here"); 

      mainPanel.Children.Add(myTextBox); 
     } 
    } 
} 

MyTextBox.cs:

using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Media; 

namespace Test 
{ 
    class MyTextBox : TextBox 
    { 
     static MyTextBox() 
     { 
      MyTextBox.BackgroundProperty.OverrideMetadata(typeof(MyTextBox), new FrameworkPropertyMetadata(Brushes.Red)); 
     } 

     public MyTextBox(string Content) 
     { 
      Text = Content; 
     } 
    } 
} 

這是爲了測試metaData Overriding函數。

現在麻煩的是:因爲我預料到這個不工作...

事實上,MyTextBox的背景是白色的,而不是紅色。

我調查,並試圖以此作爲構造爲我的自定義類:

public MyTextBox(string Content) 
{ 
    Text = Content; 
    Background = Brushes.Blue; 
    ClearValue(BackgroundProperty); 
} 

現在這裏是我發現了什麼,當我調試:

在主類:

MyTextBox myTextBox = new MyTextBox("some text here"); 

我們進入自定義類的靜態構造函數,然後在實例的構造函數中:

Text = Content; >>背景=紅

Background = Brushes.Blue; >>背景=藍色

ClearValue(BackgroundProperty); >>背景=紅了起來(如預期)

我們回到主類:

mainPanel.Children.Add(myTextBox); 

...並且在這行代碼之後,myTextBox.Background是白色。

問:爲什麼?

爲什麼當我將它添加到mainPanel時,它被設置爲白色?此外,如果我再添加一些代碼,例如:myTextBox.Background = Brushes.Blue;,然後myTextBox.ClearValue(MyTextBox.BackgroundProperty);,它會變成藍色,然後是白色,而不是紅色。

我不明白。

回答

2

背景正在由TextBox的默認樣式設置。基於Dependency Property Value Precedence Red在#11,而默認Style在#9。藍色設置將在#3,所以應該覆蓋背景精細。

您將不得不明確地設置背景(就像您使用藍色筆刷一樣),或者創建您自己的未設置背景的自定義默認樣式。您的默認樣式可以基於TextBox版本。

+0

我很懷疑,但一直沒能找到這種風格優先文件。雖然這有點奇怪...它損害了元數據的可用性。在我看來是覆蓋。 (在視覺特性方面無效) – David 2011-03-25 13:05:50

2

您可以應用到您的MyTextBox樣式集Background

<Application.Resources> 
    <Style TargetType="local:MyTextBox"> 
     <Setter Property="Background" Value="Red" /> 
    </Style> 
</Application.Resources> 

由於CodeNaked提到您的默認元數據值正在被用於文本框的默認樣式覆蓋。你可以看到它,如果你會改變你的代碼:

MyTextBox.cs:

Control.BackgroundProperty.OverrideMetadata(typeof(MyTextBox), new FrameworkPropertyMetadata(Brushes.Red, 
      FrameworkPropertyMetadataOptions.Inherits, PropertyChangedCallback)); 

    private static void PropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) 
    { 
     // set breakpoint here 
    } 

當斷點被breaked,你將能夠看到OldValueRedNewValueWhite和堆棧跟蹤你可以看到它發生是因爲應用了默認樣式。