Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当自定义属性在设计时更改时,如何更新ContentControl UI?_C#_Xaml_User Interface_Uwp - Fatal编程技术网

C# 当自定义属性在设计时更改时,如何更新ContentControl UI?

C# 当自定义属性在设计时更改时,如何更新ContentControl UI?,c#,xaml,user-interface,uwp,C#,Xaml,User Interface,Uwp,我制作了一个ContentControl,它有一些自定义的属性。控件本身工作正常,但我喜欢在XAML编辑器的设计期间更新其接口。下一个问题是:如果我更改控件的大小,则该控件的UI将更新(SizeChanged事件将执行此操作),但如果CustomProperty如OffsetX在设计期间更改,则无法找到任何方法来执行此操作 那么,如何更改下面的代码来实现这一点呢?每次更改控件UI的大小时都要更新它,这不是很方便 public sealed class MyControlElement: Cont

我制作了一个
ContentControl
,它有一些自定义的
属性。控件本身工作正常,但我喜欢在XAML编辑器的设计期间更新其接口。下一个问题是:如果我更改控件的
大小,则该控件的UI将更新(
SizeChanged事件将执行此操作),但如果
CustomProperty
OffsetX
在设计期间更改,则无法找到任何方法来执行此操作

那么,如何更改下面的代码来实现这一点呢?每次更改控件UI的大小时都要更新它,这不是很方便

public sealed class MyControlElement: ContentControl
{
    //
    //SOME INITIALIZE CODE IS HERE
    //

    public MyControlElement() => DefaultStyleKey = typeof(MyControlElement);

    protected override void OnApplyTemplate()
    {
        //
        //SOME INITIALIZE CODE IS HERE
        //

        base.OnApplyTemplate();
    }

    //OFFSET X DESCRIPTION 
    [Description("OffsetX"), Category("MyControlElementParameters"), Browsable(true)]
    //OFFSET X
    public int OffsetX
    {
        get
        {
            return (int)GetValue(OffsetXProperty);
        }
        set
        {
            if (OffsetX != value)
            {
                SetValue(OffsetXProperty, value);
                OnOffsetXChanged(this, new EventArgs());
            }
        }
    }

    public static readonly DependencyProperty OffsetXProperty = DependencyProperty.Register("OffsetX", typeof(int), typeof(MyControlElement), PropertyMetadata.Create(0));
    public event EventHandler OffsetXChanged;
    private void OnOffsetXChanged(object sender, EventArgs e)
    {
        UpdateControlUI();
        this.OffsetXChanged?.Invoke(this, e);
    }
}
我找到了某种“黑客”。仍然希望找到更好的解决方案。下一个技巧有效,可以在设计期间更新
控件
接口

    private async void ControlDesignTimeUIUpdater()
    {
        double OldImageWidth = ImageWidth;
        double OldImageHeight = ImageHeight;
        CornerRadius OldImageCornerRadius = ImageCornerRadius;
        double OldBorderThickness = BorderThickness;
        ImageSource OldMyImageSource = MyImageSource;

        while (this.IsLoaded)
        {
            //CHECK CHANGES DELAY 100ms
            await Task.Delay(100);
            //MAKE SURE CONTROL IS INITIALIZED BEFORE ANY UI UPDATES
            if (IsControlInitialized)
            {
                if (OldImageWidth != ImageWidth)
                {
                    OldImageWidth = ImageWidth;
                    SetImageWidth();
                }
                if (OldImageHeight != ImageHeight)
                {
                    OldImageHeight = ImageHeight;
                    SetImageHeight();
                }
                if (OldImageCornerRadius != ImageCornerRadius)
                {
                    OldImageCornerRadius = ImageCornerRadius;
                    SetImageCornerRadius();
                }
                if (OldBorderThickness != BorderThickness)
                {
                    OldBorderThickness = BorderThickness;
                    SetBorderThickness();
                }
                if (OldMyImageSource != MyImageSource)
                {
                    OldMyImageSource = MyImageSource;
                    SetMyImageSource();
                }
                //
                // ETC.
                //
            }
        }
    }
首先需要为加载的
添加处理程序

    public MyControlElement()
    {
        this.DefaultStyleKey = typeof(MyControlElement);
        this.Loaded += MyControlElement_Loaded;
    }

    private void MyControlElement_Loaded(object sender, RoutedEventArgs e)
    {
        //
        //SOME INITIALIZE CODE HERE IF NEEDED
        //
        //RUN CONTROL VISUAL UPDATER ONLY IF IN DESIGN MODE
        if (DesignMode.DesignModeEnabled) ControlDesignTimeUIUpdater();
        //FLAG - CONTROL HAS BEEN INITIALIZED
        IsControlInitialized = true;
    }
让我们为UI更新添加
ControlDesignTimeUIUpdater
void。此
void
有一个循环,用于在设计期间保持UI更新

    private async void ControlDesignTimeUIUpdater()
    {
        double OldImageWidth = ImageWidth;
        double OldImageHeight = ImageHeight;
        CornerRadius OldImageCornerRadius = ImageCornerRadius;
        double OldBorderThickness = BorderThickness;
        ImageSource OldMyImageSource = MyImageSource;

        while (this.IsLoaded)
        {
            //CHECK CHANGES DELAY 100ms
            await Task.Delay(100);
            //MAKE SURE CONTROL IS INITIALIZED BEFORE ANY UI UPDATES
            if (IsControlInitialized)
            {
                if (OldImageWidth != ImageWidth)
                {
                    OldImageWidth = ImageWidth;
                    SetImageWidth();
                }
                if (OldImageHeight != ImageHeight)
                {
                    OldImageHeight = ImageHeight;
                    SetImageHeight();
                }
                if (OldImageCornerRadius != ImageCornerRadius)
                {
                    OldImageCornerRadius = ImageCornerRadius;
                    SetImageCornerRadius();
                }
                if (OldBorderThickness != BorderThickness)
                {
                    OldBorderThickness = BorderThickness;
                    SetBorderThickness();
                }
                if (OldMyImageSource != MyImageSource)
                {
                    OldMyImageSource = MyImageSource;
                    SetMyImageSource();
                }
                //
                // ETC.
                //
            }
        }
    }

通过这种
Hack
可以在设计过程中“实时”更新控制。甚至可以添加
动画
、大小更改等。

尝试附加具有DependencyProperty:new PropertyMetadata(0,OnOffsetXChanged))Bilal的事件处理程序,不幸的是,这一个在设计时不起作用。您好,XAML Designer是一个相对静态的预览界面。您对自定义控件所做的UI更改可以通过重建项目来更改,但某些动态更改(如SizeChanged)需要您运行应用程序才能查看。我误解了您的问题。代码隐藏在设计时不起作用。