在我的一个用户控件下面:
<div class="parent">
<p>Menu Option A</p>
<p>Menu Option B</p>
</div>
<p>Doesn't get the :after effect</p>
以及我的依赖项属性的代码隐藏:
<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>
然后从我的wpf主窗口:
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); }
}
}
我要做的是从我的主窗口设置用户控件的宽度和高度。在上面的例子中,我试图通过依赖属性ControlHeight和ControlWidth分别将用户控件的高度和宽度设置为100。
如果未指定我的主窗口ControlHeight和ControlWidth,我希望用户控件的高度和宽度取默认值为45。
但上面的例子对我不起作用。我做错了什么?
更新工作: 正如Clemens建议的那样,我已将代码更改为以下内容:
<ctr:CircularProgressBar x:Name="progressBar" Grid.ZIndex="3"
HorizontalAlignment="Center"
VerticalAlignment="Center"
ControlHeight="100"
ControlWidth="100"/>
在代码隐藏依赖项属性中,不需要ControlHeightProperty和ControlWidthProperty。
最后在我的wpf窗口中,设置典型的高度和宽度属性就足够了:
<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>
答案 0 :(得分:6)
您必须绑定到实际属性,而不是其标识符字段,即ControlWidth
而不是ControlWidthProperty
。
除此之外,您还必须设置一个绑定源,在本例中是UserControl实例,由UserControl级别的RelativeSource Self
或下面任何级别的RelativeSource AncestorType=UserControl
引用。
<UserControl Width="{Binding ControlWidth, RelativeSource={RelativeSource Self}}" ...>
<Viewbox Width="{Binding ControlWidth,
RelativeSource={RelativeSource AncestorType=UserControl}}" ...>
但请注意,这些绑定都不是真的有意义。当已经存在ControlWidth
时,添加Width
属性是没有意义的。
在Viewbox中,没有必要绑定Width或Height,因为UserControl已经适当地调整了它的大小。
所以事实上你不需要任何额外的财产。您的UserControl的XAML应如下所示,而无需明确设置任何宽度或高度。
<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。