C# Can';t在设计器中更新WPF用户控件
我真的疯了,我做了我在网上找到的一切,但仍然没有机会 我有一个简单的矩形和一个红色/蓝色的枚举。我想在designer中通过用户更改值来设置其颜色的动画 MyCustomUC.xaml.csC# Can';t在设计器中更新WPF用户控件,c#,wpf,C#,Wpf,我真的疯了,我做了我在网上找到的一切,但仍然没有机会 我有一个简单的矩形和一个红色/蓝色的枚举。我想在designer中通过用户更改值来设置其颜色的动画 MyCustomUC.xaml.cs using System; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Anim
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.ComponentModel;
using System.Diagnostics;
namespace WpfApp1
{
public enum Pill
{ red = 1, blue = 2 }
public partial class MyCustomUC : UserControl
{
private Color ColorToAnim = Color.FromRgb(255, 0, 0);
public static DependencyProperty pill_mode = DependencyProperty.Register(
"pillmodeval", typeof(Pill), typeof(MyCustomUC),
new PropertyMetadata(Pill.blue, // ISSUE 1 : Default Value Is Not Working , It's always 0
new PropertyChangedCallback(OnValueChanged)
));
[Category("Pills")]
public Pill pillmodeval
{
get { return (Pill)GetValue(pill_mode); }
set { SetValue(pill_mode, value); }
}
public MyCustomUC()
{
InitializeComponent(); //// Not Firing Either
color_output.Fill = new SolidColorBrush(ColorToAnim);
// ISSUE 2 : MessageBox.Show , Debug.WriteLine Not Work On Design Mode
MessageBox.Show("MyCustomUC Created!");
Debug.WriteLine("MyCustomUC Created!");
}
void AnimateColor()
{
ColorAnimation new_color_anim = new ColorAnimation(ColorToAnim, TimeSpan.FromSeconds(1));
color_output.Fill.BeginAnimation(SolidColorBrush.ColorProperty, new_color_anim);
}
void UpdateColor()
{
if (pillmodeval == Pill.red)
{
ColorToAnim = Color.FromRgb(0, 0, 255);
pillmodeval = Pill.blue;
}
else
{
ColorToAnim = Color.FromRgb(255, 0, 0);
pillmodeval = Pill.red;
}
}
private void color_output_MouseUp(object sender, MouseButtonEventArgs e)
{
UpdateColor();
}
private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MyCustomUC custom_uc = (MyCustomUC)d;
// ISSUE 3 : AnimateColor not working in Designer
custom_uc.AnimateColor();
}
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
// ISSUE 2 : MessageBox.Show , Debug.WriteLine Not Work On Design Mode
MessageBox.Show("MyCustomUC Loaded!");
Debug.WriteLine("MyCustomUC Loaded!");
}
}
}
MyCustomUC.xaml:
<UserControl x:Class="WpfApp1.MyCustomUC"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
d:DesignHeight="100" d:DesignWidth="100" Loaded="UserControl_Loaded">
<Grid>
<Rectangle x:Name="color_output" Fill="Black" MouseUp="color_output_MouseUp" />
</Grid>
</UserControl>
问题:
<UserControl x:Class="WpfApp1.MyCustomUC"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
d:DesignHeight="100" d:DesignWidth="100" Loaded="UserControl_Loaded">
<Grid>
<Rectangle x:Name="color_output" Fill="Black" MouseUp="color_output_MouseUp" />
</Grid>
</UserControl>
- 构造函数调用在设计器中不起作用
- OnLoad调用在设计器中不起作用
- AnimateColor在Designer中不起作用
- DependencyProperty默认值始终为零,不适用于枚举
如何使此代码工作?Visual Studio XAML designer就是这样工作的。无法查看动画,因为您将库引用为解决方案项目。VS designer不会在设计时为作为解决方案项目引用的库运行任何complie-time代码 VS designer将只显示可以应用的更改,而无需编译整个库。为此,您必须使用XAML绑定,而不是使用后台代码,例如:
Abc
公共部分类UserControl1:UserControl
{
公共用户控制1()
{
初始化组件();
}
公共图书馆
{
获取{return(bool)GetValue(showtproperty);}
set{SetValue(showittproperty,value);}
}
公共静态只读从属属性ShowItProperty=
DependencyProperty.Register(“ShowIt”、typeof(bool)、typeof(UserControl1)、newpropertyMetadata(true));
}
您可以在materialdesigninxaml.net库的控件中看到动画,因为您直接将其引用为DLL库。如果将库引用为已编译的DLL,则动画应按预期工作
这就是VisualStudioXAML设计器的工作原理。无法查看动画,因为您将库引用为解决方案项目。VS designer不会在设计时为作为解决方案项目引用的库运行任何complie-time代码 VS designer将只显示可以应用的更改,而无需编译整个库。为此,您必须使用XAML绑定,而不是使用后台代码,例如:
Abc
公共部分类UserControl1:UserControl
{
公共用户控制1()
{
初始化组件();
}
公共图书馆
{
获取{return(bool)GetValue(showtproperty);}
set{SetValue(showittproperty,value);}
}
公共静态只读从属属性ShowItProperty=
DependencyProperty.Register(“ShowIt”、typeof(bool)、typeof(UserControl1)、newpropertyMetadata(true));
}
您可以在materialdesigninxaml.net库的控件中看到动画,因为您直接将其引用为DLL库。如果将库引用为已编译的DLL,则动画应按预期工作
Visual Studio XAML设计器是实际标记的静态表示。它不执行任何方法。它使用属性默认值进行显示。但是您可以提供一个上下文来获得当前视图的更完整的外观。要设计和/或视觉状态,您可以使用。它提供了很多额外功能来生成视图代码,而无需编写太多代码,如触发器、行为、事件处理程序、动画、视觉状态、模板、,etc@BionicCode但我认为这是可能的,库中的所有内容都是在designer中实时发生的。@BionicCode所以你的意思是它只在标记代码中可能,而不是在viewmodel中,对吗?那么defaul enum呢?你所说的“实时发生”是什么意思?您可以单击按钮并触发动画吗?我对此表示怀疑。这与图书馆无关。设计师就是这样工作的。但您可以在不确定模式下显示未由诸如
ProgressBar
之类的交互触发的动画。您可以设置自定义值以初始化视图模型的绑定,例如TextBlock.Text
或ListView.ItemsSource
以显示一些设计时值。检查Visual Studio XAML设计器是否是实际标记的静态表示形式。它不执行任何方法。它使用属性默认值进行显示。但是您可以提供一个上下文来获得当前视图的更完整的外观。要设计和/或视觉状态,您可以使用。它提供了很多额外功能来生成视图代码,而无需编写太多代码,如触发器、行为、事件处理程序、动画、视觉状态、模板、,etc@BionicCode但我认为这是可能的,库中的所有内容都是在designer中实时发生的。@BionicCode所以你的意思是它只在标记代码中可能,而不是在viewmodel中,对吗?那么defaul enum呢?你所说的“实时发生”是什么意思?您可以单击按钮并触发动画吗?我对此表示怀疑。这与图书馆无关。设计师就是这样工作的。但您可以在不确定模式下显示未由诸如ProgressBar
之类的交互触发的动画。您可以设置自定义值以初始化视图模型的绑定,例如TextBlock.Text
或ListView.ItemsSource
以显示一些设计时值。检查