WPF 设置用户控件依赖属性
WPF Set user control dependency properties
下面是我的一段用户控件:
<UserControl x:Class="WpfApplication1.Controls.CircularProgressBar"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Background="Transparent"
Height="{Binding ControlHeightProperty}"
Width="{Binding ControlWidthProperty}">
<UserControl.Resources>
<SolidColorBrush x:Key="progressCirclesColor" Color="#FF2E6187" />
</UserControl.Resources>
<Viewbox Width="{Binding ControlWidthProperty}" Height="{Binding ControlHeightProperty}" HorizontalAlignment="Center" VerticalAlignment="Center">
<!-- other objects -->
</Viewbox>
</UserControl>
及其与我的依赖属性的代码隐藏:
public partial class CircularProgressBar
{
public static readonly DependencyProperty ControlHeightProperty =
DependencyProperty.Register("ControlHeight", typeof(int), typeof(CircularProgressBar), new UIPropertyMetadata(45));
public static readonly DependencyProperty ControlWidthProperty =
DependencyProperty.Register("ControlWidth", typeof(int), typeof(CircularProgressBar), new UIPropertyMetadata(45));
public int ControlHeight
{
get { return (int)GetValue(ControlHeightProperty); }
set { SetValue(ControlHeightProperty, value); }
}
public int ControlWidth
{
get { return (int)GetValue(ControlWidthProperty); }
set { SetValue(ControlWidthProperty, value); }
}
}
然后从我的 wpf main window:
<ctr:CircularProgressBar x:Name="progressBar" Grid.ZIndex="3"
HorizontalAlignment="Center"
VerticalAlignment="Center"
ControlHeight="100"
ControlWidth="100"/>
我想做的是从主 window 为我的用户控件设置宽度和高度。在上面的示例中,我试图分别通过依赖属性 ControlHeight 和 ControlWidth 将用户控件的高度和宽度设置为 100。
如果从我的主要 windows ControlHeight 和 ControlWidth 未指定,我希望用户控件的高度和宽度采用默认值 45。
但是上面的例子对我不起作用。我做错了什么?
更新工作:
正如 Clemens 所建议的,我已将代码更改为以下内容:
<UserControl x:Class="WpfApplication1.Controls.CircularProgressBar"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Background="Transparent">
<UserControl.Resources>
<SolidColorBrush x:Key="progressCirclesColor" Color="#FF2E6187" />
</UserControl.Resources>
<Viewbox HorizontalAlignment="Center" VerticalAlignment="Center">
<!-- other objects -->
</Viewbox>
</UserControl>
不需要代码隐藏依赖属性 ControlHeightProperty 和 ControlWidthProperty。
最后在我的 wpf window 中,设置典型的高度和宽度属性就足够了:
<ctr:CircularProgressBar x:Name="progressBar" Grid.ZIndex="3"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Height="100"
Width="100"/>
您必须绑定到实际的 属性,而不是其标识符字段,即 ControlWidth
而不是 ControlWidthProperty
。
除此之外,您还必须设置绑定源,在本例中为 UserControl 实例,在 UserControl 级别由 RelativeSource Self
引用,或在以下任何级别由 RelativeSource AncestorType=UserControl
引用。
<UserControl Width="{Binding ControlWidth, RelativeSource={RelativeSource Self}}" ...>
<Viewbox Width="{Binding ControlWidth,
RelativeSource={RelativeSource AncestorType=UserControl}}" ...>
但是请注意,none 这些绑定确实有意义。当已经有 Width
.
时,添加 ControlWidth
属性 是没有意义的
在 Viewbox 中没有必要绑定 Width 或 Height,因为 UserControl 已经适当地调整了它的大小。
所以实际上您不需要任何额外的 属性。您的 UserControl 的 XAML 应如下所示,无需显式设置 any 宽度或高度。
<UserControl x:Class="WpfApplication1.Controls.CircularProgressBar"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Background="Transparent">
<UserControl.Resources>
<SolidColorBrush x:Key="progressCirclesColor" Color="#FF2E6187" />
</UserControl.Resources>
<Viewbox>
<!-- other objects -->
</Viewbox>
</UserControl>
当您在 MainWindow 的某处使用该控件时,无需设置 ControlWidth 和 ControlHeight,只需设置 Width 和 Height。
下面是我的一段用户控件:
<UserControl x:Class="WpfApplication1.Controls.CircularProgressBar"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Background="Transparent"
Height="{Binding ControlHeightProperty}"
Width="{Binding ControlWidthProperty}">
<UserControl.Resources>
<SolidColorBrush x:Key="progressCirclesColor" Color="#FF2E6187" />
</UserControl.Resources>
<Viewbox Width="{Binding ControlWidthProperty}" Height="{Binding ControlHeightProperty}" HorizontalAlignment="Center" VerticalAlignment="Center">
<!-- other objects -->
</Viewbox>
</UserControl>
及其与我的依赖属性的代码隐藏:
public partial class CircularProgressBar
{
public static readonly DependencyProperty ControlHeightProperty =
DependencyProperty.Register("ControlHeight", typeof(int), typeof(CircularProgressBar), new UIPropertyMetadata(45));
public static readonly DependencyProperty ControlWidthProperty =
DependencyProperty.Register("ControlWidth", typeof(int), typeof(CircularProgressBar), new UIPropertyMetadata(45));
public int ControlHeight
{
get { return (int)GetValue(ControlHeightProperty); }
set { SetValue(ControlHeightProperty, value); }
}
public int ControlWidth
{
get { return (int)GetValue(ControlWidthProperty); }
set { SetValue(ControlWidthProperty, value); }
}
}
然后从我的 wpf main window:
<ctr:CircularProgressBar x:Name="progressBar" Grid.ZIndex="3"
HorizontalAlignment="Center"
VerticalAlignment="Center"
ControlHeight="100"
ControlWidth="100"/>
我想做的是从主 window 为我的用户控件设置宽度和高度。在上面的示例中,我试图分别通过依赖属性 ControlHeight 和 ControlWidth 将用户控件的高度和宽度设置为 100。
如果从我的主要 windows ControlHeight 和 ControlWidth 未指定,我希望用户控件的高度和宽度采用默认值 45。
但是上面的例子对我不起作用。我做错了什么?
更新工作: 正如 Clemens 所建议的,我已将代码更改为以下内容:
<UserControl x:Class="WpfApplication1.Controls.CircularProgressBar"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Background="Transparent">
<UserControl.Resources>
<SolidColorBrush x:Key="progressCirclesColor" Color="#FF2E6187" />
</UserControl.Resources>
<Viewbox HorizontalAlignment="Center" VerticalAlignment="Center">
<!-- other objects -->
</Viewbox>
</UserControl>
不需要代码隐藏依赖属性 ControlHeightProperty 和 ControlWidthProperty。
最后在我的 wpf window 中,设置典型的高度和宽度属性就足够了:
<ctr:CircularProgressBar x:Name="progressBar" Grid.ZIndex="3"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Height="100"
Width="100"/>
您必须绑定到实际的 属性,而不是其标识符字段,即 ControlWidth
而不是 ControlWidthProperty
。
除此之外,您还必须设置绑定源,在本例中为 UserControl 实例,在 UserControl 级别由 RelativeSource Self
引用,或在以下任何级别由 RelativeSource AncestorType=UserControl
引用。
<UserControl Width="{Binding ControlWidth, RelativeSource={RelativeSource Self}}" ...>
<Viewbox Width="{Binding ControlWidth,
RelativeSource={RelativeSource AncestorType=UserControl}}" ...>
但是请注意,none 这些绑定确实有意义。当已经有 Width
.
ControlWidth
属性 是没有意义的
在 Viewbox 中没有必要绑定 Width 或 Height,因为 UserControl 已经适当地调整了它的大小。
所以实际上您不需要任何额外的 属性。您的 UserControl 的 XAML 应如下所示,无需显式设置 any 宽度或高度。
<UserControl x:Class="WpfApplication1.Controls.CircularProgressBar"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Background="Transparent">
<UserControl.Resources>
<SolidColorBrush x:Key="progressCirclesColor" Color="#FF2E6187" />
</UserControl.Resources>
<Viewbox>
<!-- other objects -->
</Viewbox>
</UserControl>
当您在 MainWindow 的某处使用该控件时,无需设置 ControlWidth 和 ControlHeight,只需设置 Width 和 Height。