我不确定我是否使用了正确的方法,所以我尝试在这里描述我的情况。请帮忙指出细节。
我的目的是自定义 WPFPopup
类并实现特定的弹出面板。我使用 CustomControl 来实现它,如下所示:
这里是Generic.xaml
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication3">
<Style TargetType="{x:Type local:CCPopup}">
<Setter Property="AllowsTransparency" Value="True" />
<Setter Property="StaysOpen" Value="False" />
<Setter Property="Placement" Value="Center" />
<Setter Property="Child">
<Setter.Value>
<Border Background="Red"
Width="30"
Height="30" />
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
以下是代码,仅注册元样式信息:
public class CCPopup : Popup
{
static CCPopup()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(CCPopup), new FrameworkPropertyMetadata(typeof(CCPopup)));
}
}
到目前为止我遇到的问题可以总结如下:
1)我试着写:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication3">
<Style TargetType="{x:Type local:CCPopup}" BasedOn="{StaticResource {x:Type Popup}}">
<Setter Property="AllowsTransparency" Value="True"/>
<Setter Property="StaysOpen" Value="False" />
<Setter Property="Placement" Value="Center" />
<Setter Property="Child">
<Setter.Value>
<Border Background="Red"
Width="30"
Height="30" />
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
但这不起作用,我得到错误{x:Type Popup}
无法解决。为什么?
关于我的 MainWindow.xaml:我只添加<CCPopup x:Key="popup" />
它的资源并创建一个按钮,当我单击按钮时,我将弹出窗口绑定PlacementTarget
到此按钮并IsOpen
在代码中将弹出窗口的属性设置为 true。
2)当我在代码中创建CCPopup的实例时CCPopup p = new CCPopup()
,有些Style不起作用,比如AllowsTransparency
and StaysOpen
,不会设置成我在xaml Style中给的值。但是当我从 xaml 创建一个实例<CCPopup x:Key="popup" />
并从代码中的资源中引用它时,该样式可以正常工作。你能指出我哪里做错了吗?
3)只是好奇为什么Popup
类没有Template
财产?
谢谢你的帮助。