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)需要您运行应用程序才能查看。我误解了您的问题。代码隐藏在设计时不起作用。