是否可以在定义它的元素的XAML中调用自定义依赖项属性?
我的意思是,我的mainWindow有以下简单代码:
代码
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);
}
}
}
如何从MainWindow类的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 :(得分:3)
我在最初发布错误答案后找到答案:
如果你使用andreask的答案,问题实际上在于循环依赖。我必须为所有窗口创建一个BaseClass:
1)创建一个新的Window Base Class:
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);
}
}
}
这将是所有窗口的新基类
2)修改您的MainWindow xaml:
(将YOURNAMESPACE(2x)更改为您的命名空间名称)
<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)您还需要修改部分MainWindow.cs:
public partial class MainWindow : BaseWindow {
public MainWindow() {
InitializeComponent();
}
}
但是,对我来说,你总是需要在窗口声明中使用额外的xaml标记。
答案 1 :(得分:1)
我正在回答我自己的问题,因为似乎有很多方法可以正确地解决它。我推荐了最能帮助我的答案,但我不能将其作为正确的答案,因为一切都是正确的。
所以我只想发表一个结论。如果您认为我错了,请发表评论,我会纠正我的想法。
我的问题的主要答案是否定的,不能直接从其“链接”XAML文件调用代码隐藏中定义的自定义依赖项属性。必须实例化定义属性的控件来调用它。
对我来说,在代码隐藏中定义的在XAML中使用自定义依赖项属性的最佳工作方式是由@Clemens和@Noel Widmer发布的。 This和this
答案 2 :(得分: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
类不是&#39 ; t。知道自定义依赖项属性(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>
但是,这意味着你需要省略用于组合XAML和窗口代码隐藏的x:class
指令(否则你会遇到循环依赖),我不确定是否这正确地使你的窗户正常化...
答案 3 :(得分:0)
是的,有可能。依赖性属性用于在XAML中进行绑定。如果要绑定到窗口后面代码中定义的属性,则需要将此窗口引用为XAML元素,即为主窗口x:Name =“ mainWindow”添加标签,然后在绑定表达式中将其称为ElementName = mainWindow