派生控件的自定义依赖属性的值不显示在 VS 的属性编辑器窗口中

问题描述 投票:0回答:0

我正在处理一个派生控件,在我的例子中是一个

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
内的控件上设置的任何绑定或属性值可能无法正确序列化。或者类似的东西。

wpf wpf-controls visual-studio-2022 .net-4.8
© www.soinside.com 2019 - 2024. All rights reserved.