2015-02-09 53 views
3

是否可以在定義它的元素的XAML中調用自定義依賴項屬性?在XAML中調用在代碼隱藏中定義的自定義依賴項屬性

我的意思是,我有以下簡單的代碼爲我的主窗口:

代碼

public partial class MainWindow : Window 
{ 

    public static readonly DependencyProperty SpecialToProperty = DependencyProperty.Register("SpecialTo", typeof(double), typeof(MainWindow)); 

    public MainWindow() 
    { 

     InitializeComponent(); 

    } 

    public double SpecialTo 
    { 
     get 
     { 
      return (double)GetValue(SpecialToProperty); 
     } 
     set 
     { 
      SetValue(DoubleAnimation.ToProperty, value); 
     } 
    } 
} 

我如何使用從主窗口類的XAML部分代碼依賴屬性?

我的意思是這樣的:

<Window x:Class="WpfAnimationTEst.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"   
    SpecialTo=200> 

我知道它可以使用附帶的依賴屬性來實現,但它是唯一的出路?是不是可以調用代碼隱藏中定義的依賴項屬性?

謝謝你,對不起,如果問題是某種愚蠢的,我只是學習,並試圖理解WPF。

回答

0

您可以在XAML中使用自定義依賴項屬性,但僅限於在XAML中實例化控件。例如,採取定製TextBox元素:

public class MyTextBox : TextBox 
{ 
    public static readonly DependencyProperty SpecialToProperty = DependencyProperty.Register("SpecialTo", typeof(double), typeof(MyTextBox)); 

    public double SpecialTo 
    { 
     get 
     { 
      return (double)GetValue(SpecialToProperty); 
     } 
     set 
     { 
      SetValue(DoubleAnimation.ToProperty, value); 
     } 
    } 
} 

當然你也可以在XAML創建MyTextBox一個實例,並指定SpecialTo屬性有:

<custom:MyTextBox SpecialTo="1.0" /> 

在你的情況,但是,你沒有實例化自定義類MainWindow,但創建了Window類的新實例,而Window類不知道自定義依賴項屬性(SpecialTo屬性在Window中甚至不可用,因爲您在MainWindow類中聲明)。

對於要認識到依賴屬性,你需要直接實例MainWindow

<custom:MainWindow 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"   
    SpecialTo=200> 

但是,這意味着你需要省略x:class指令,用於合併XAML代碼隱藏和你的窗口(否則你會遇到循環依賴),並且我不確定這是否正確地提升了你的窗口...

2

我在最初發布錯誤答案後找到了答案:
問題真的在於循環依賴如果你使用andre問的答案。我不得不爲所有的窗戶裏繼承:
1)創建一個新窗口的基類:

public class BaseWindow : Window { 
    public BaseWindow() { } 

    public static readonly DependencyProperty SpecialToProperty = DependencyProperty.Register("SpecialTo", typeof(double), typeof(BaseWindow)); 

    public double SpecialTo { 
     get { 
      return (double)GetValue(SpecialToProperty); 
     } 
     set { 
      SetValue(SpecialToProperty, value); 
     } 
    } 
} 

這將是所有Windows新的基類。
2)修改主窗口的XAML:
(更改YOURNAMESPACE(2個),以你的名字命名)

<local:BaseWindow x:Class="YOURNAMESPACE.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:YOURNAMESPACE" 
     Title="MainWindow" Height="350" Width="525" SpecialTo="100"> 
    <Grid> 

    </Grid> 
</local:BaseWindow> 

3)而且你還需要修改部分主窗口。CS:

public partial class MainWindow : BaseWindow { 
     public MainWindow() { 
      InitializeComponent(); 
     } 
    } 

這爲我工作,但是,你永遠需要使用額外的XAML標記在自己的窗口申報。

+0

@Clemens是的,我告訴了我,我想,因爲它是一種完全不同的方法,我寧願創建一個新的。請糾正我,如果我錯了... – 2015-02-09 12:48:36

0

我回答我自己的問題,因爲似乎有很多方法可以正確解決它。我已經提出了最能幫助我的答案,但我無法將其設置爲正確答案,因爲所有答案都是正確的。

所以我只是發表一個結論。如果你認爲我錯了,請發表評論,我會糾正我的想法。

我的問題的主要答案是否定的,不可能直接調用在其「鏈接」XAML文件中的代碼隱藏中定義的自定義依賴項屬性。實例化該屬性被定義爲調用它的控件是強制性的。

對我來說,在代碼隱藏中定義的在XAML中使用自定義依賴屬性的最佳工作環境是@Clemens和@Noel Widmer發佈的。 Thisthis

+0

也許值得一提的是,你可以**綁定到Window的屬性在自己的XAML,所以訪問屬性值沒有問題。仍然不確定您的意思是「調用自定義依賴項屬性」。看到我更新的答案。 – Clemens 2015-02-12 22:35:23

相關問題