我正在处理一个派生控件,在我的例子中是一个
ToolTip
,我正面临一个关于它的自定义依赖属性的问题。每次我将自定义依赖属性的值更改为默认值以外的任何值时,在我运行我的应用程序并关闭它后,进入 Visual Studio 的属性编辑器时,该字段为空。
这是我派生的
ToolTip
控件的代码示例:
namespace MyControlLibrary.Controls
{
public class MyToolTip : ToolTip
{
public enum IconTypes
{
Custom,
Error,
Information,
None,
Question,
Warning,
}
public static readonly DependencyProperty IconTypeProperty =
DependencyProperty.Register(nameof(IconType),
typeof(IconTypes),
typeof(MyToolTip),
new FrameworkPropertyMetadata(IconTypes.None,
new PropertyChangedCallback(OnIconTypeChanged)));
[Category("MyCategory")]
[Description("...")]
public IconTypes IconType
{
get { return (IconTypes)GetValue(IconTypeProperty); }
set { SetValue(IconTypeProperty, value); }
}
private static void OnIconTypeChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
}
static MyToolTip()
{
//DefaultStyleKeyProperty.OverrideMetadata(typeof(MyToolTip), new FrameworkPropertyMetadata(typeof(MyToolTip)));
}
public MyToolTip()
{
}
}
}
这就是我测试它的方式
MainWindow
:
<Window
x:Class="MyApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
xmlns:local="clr-namespace:MyApp"
xmlns:MyControls="clr-namespace:MyControlLibrary.Controls;assembly=MyControlLibrary"
Title="MainWindow"
Height="450"
Width="800"
WindowStartupLocation="CenterScreen">
<Grid>
<Button
Content="MyToolTip Test"
Cursor="Hand"
Padding="9"
HorizontalAlignment="Center"
VerticalAlignment="Center">
<Button.ToolTip>
<MyControls:MyToolTip>
<StackPanel>
<TextBlock Text="MyToolTip Test!!!"/>
</StackPanel>
</MyControls:MyToolTip>
</Button.ToolTip>
</Button>
</Grid>
</Window>
在启动和关闭应用程序之前:
之后:
更新 05/05/2023:
在这里您可以下载重现问题的VS解决方案。
2023 年 6 月 5 日更新:
当派生控件嵌套在
ToolTip
!!! 中时会发生此问题
我创建了一个不同的派生控件,例如
TextBlock
,具有自定义依赖属性,我将其放入 <Button.ToolTip>...</Button.ToolTip>
中,但我遇到了同样的问题。但是如果我把它从 <Button.ToolTip>...</Button.ToolTip>
中删除,问题就不复存在了!
看起来自定义依赖属性值的序列化有问题,因为当
ToolTip
显示时,会创建一个新的 Popup
控件来承载 ToolTip
的内容,而这个 Popup
控件不属于MainWindow
的可视化树,因此在 ToolTip
内的控件上设置的任何绑定或属性值可能无法正确序列化。或者类似的东西。