C# WPF-VS2019如何自定义控件,使其在从工具箱拖动到设计视图时具有默认值?
将自定义控件拖动到“设计”视图中时,它只会在xaml.cs中将其清空C# WPF-VS2019如何自定义控件,使其在从工具箱拖动到设计视图时具有默认值?,c#,wpf,visual-studio,wpf-controls,toolbox,C#,Wpf,Visual Studio,Wpf Controls,Toolbox,将自定义控件拖动到“设计”视图中时,它只会在xaml.cs中将其清空 但是,当我将文本框从工具箱拖到设计视图中时,它会弹出默认变量,如: 已在xaml中填写 如何为自己的自定义控件设置这些默认值?我到处都找遍了,甚至不知道要找什么才能找到答案 我希望我的控件在拖动到“设计”视图时如下所示: 与上面TextBox的Text=“TextBox”和TextWrapping=“Wrap”类似,我希望我的机器能够自动输入TextBoxContent=“Text”和Label=“Text” 我已经查看
但是,当我将文本框从工具箱拖到设计视图中时,它会弹出默认变量,如:
已在xaml中填写
如何为自己的自定义控件设置这些默认值?我到处都找遍了,甚至不知道要找什么才能找到答案
我希望我的控件在拖动到“设计”视图时如下所示:
与上面TextBox的Text=“TextBox”和TextWrapping=“Wrap”类似,我希望我的机器能够自动输入TextBoxContent=“Text”和Label=“Text”
我已经查看了TextBox.cs的源代码,没有发现任何明显的点使它能够自动执行此操作。下面是TextBox文本的依赖属性和公共属性
/// <summary>
/// The DependencyID for the Text property.
/// Default Value: ""
/// </summary>
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register(
"Text", // Property name
typeof(string), // Property type
typeof(TextBox), // Property owner
new FrameworkPropertyMetadata( // Property metadata
string.Empty, // default value
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault | // Flags
FrameworkPropertyMetadataOptions.Journal,
new PropertyChangedCallback(OnTextPropertyChanged), // property changed callback
new CoerceValueCallback(CoerceText),
true, // IsAnimationProhibited
UpdateSourceTrigger.LostFocus // DefaultUpdateSourceTrigger
));
//
///文本属性的DependencyID。
///默认值:“
///
公共静态只读DependencyProperty TextProperty=
从属属性。寄存器(
“Text”,//属性名称
typeof(字符串),//属性类型
typeof(TextBox),//属性所有者
新的FrameworkPropertyMetadata(//属性元数据
string.Empty,//默认值
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault |//标志
FrameworkPropertyMetadataOptions.Journal,
新建PropertyChangedCallback(OnTextPropertyChanged),//属性更改回调
新的强制值回调(强制文本),
true,//isanimation禁止
UpdateSourceTrigger.LostFocus//DefaultUpdateSourceTrigger
));
及
//
///文本框的内容。
///
[默认值(“”)
[可本地化性(LocalizationCategory.Text)]
公共字符串文本
{
获取{return(string)GetValue(TextProperty);}
set{SetValue(TextProperty,value);}
}
感谢所有阅读本文并能提供帮助的人
编辑:
带有“SFTEPutLayout”的Syncfusion示例当我将其拖到设计视图时,它会自动添加一个文本框子项,并用“John”填充该文本框文本
当控件拖到设计视图时,会自动添加Hint=“name”和Text=“John”。我想对我的控件执行类似的操作。@wyattk。
当我将控件拖动到XAML中时,该控件不显示关联的属性。我查阅了相关文件,但没有找到相关设置。这可能是控件的Visual Studio设置。
为了设置自定义控件属性的默认值,我制作了一个自定义控件,当它从“工具箱”拖到设计视图中时,它有dependencProperty角度和一个默认值。这是我的代码,您可以参考它来设置自定义控件的默认值
xaml代码:
<Grid>
<local:MyControl Content="MyControl" HorizontalAlignment="Left" Margin="330,221,0,0" VerticalAlignment="Top" Width="75"/>
</Grid>
更新:
为提供VS designer的默认值。你可以试着使用class。我在Visual Studio Enterprise 2019版本16.9.3中创建了我的程序。
请将Microsoft.Windows.Design.Extensibility和Microsoft.Windows.Design.Interaction添加到项目引用中。
步骤是:在程序中的引用上单击鼠标右键,然后在弹出框中选择“添加引用…”,然后可以在“引用管理器”页面上选择程序集,然后搜索依赖项
CustomControl1代码如下所示:
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using Microsoft.Windows.Design.Model;
using Microsoft.Windows.Design.Features;
namespace MyControl
{
[Feature(typeof(myDefaults))]
public class CustomControl1 : Control
{
static CustomControl1()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1)));
}
static double num = 70.0;
public CustomControl1()
{
this.Initialized += (s, e) =>
{
var element = s as UIElement;
if (element != null)
{
element.RenderTransformOrigin = new Point(0.5, 0.5);
element.RenderTransform = new RotateTransform(num);
}
};
}
public double Angle
{
get { return (double)GetValue(AngleProperty); }
set { SetValue(AngleProperty, value); }
}
public static readonly DependencyProperty AngleProperty =
DependencyProperty.RegisterAttached("Angle", typeof(double), typeof(CustomControl1), new PropertyMetadata(num, OnAngleChanged));
private static void OnAngleChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
num = (double)e.NewValue;
var element = obj as UIElement;
if (element != null)
{
element.RenderTransformOrigin = new Point(0.5, 0.5);
element.RenderTransform = new RotateTransform(num);
}
}
public class myDefaults : DefaultInitializer
{
public override void InitializeDefaults(ModelItem item)
{
item.Name = "myControl";
item.Properties["Angle"].SetValue("70.0");
}
}
}
}
然后将此控件拖放到Design上,您将在XAML中看到以下代码:
<local:CustomControl1 x:Name="myControl" Angle="70.0" HorizontalAlignment="Left" Height="100" Margin="252,66,0,0" VerticalAlignment="Top" Width="100"/>
结果是:
这不是我要找的。感谢您的回复,但是,我正在寻找一种方法来设置您所称的“控件的VisualStudio设置”。当我将syncfusion控件拖到设计时,它也会进行类似的填充。我也会用syncfusion的例子更新主帖子。嗨,@wyattk。我已经更新了我的答案,你可以检查一下,如果你有任何问题请告诉我。
public class MyControl : Button
{
static double num = 90.0;
public MyControl()
{
this.Initialized += (s, e) =>
{
var element = s as UIElement;
if (element != null)
{
element.RenderTransformOrigin = new Point(0.5, 0.5);
element.RenderTransform = new RotateTransform(num);
}
};
}
public double Angle
{
get { return (double)GetValue(AngleProperty); }
set { SetValue(AngleProperty, value); }
}
public static readonly DependencyProperty AngleProperty =
DependencyProperty.RegisterAttached("Angle", typeof(double), typeof(MyControl), new PropertyMetadata(num, OnAngleChanged));
private static void OnAngleChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
num = (double)e.NewValue;
var element = obj as UIElement;
if (element != null)
{
element.RenderTransformOrigin = new Point(0.5, 0.5);
element.RenderTransform = new RotateTransform(num);
}
}
}
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using Microsoft.Windows.Design.Model;
using Microsoft.Windows.Design.Features;
namespace MyControl
{
[Feature(typeof(myDefaults))]
public class CustomControl1 : Control
{
static CustomControl1()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1)));
}
static double num = 70.0;
public CustomControl1()
{
this.Initialized += (s, e) =>
{
var element = s as UIElement;
if (element != null)
{
element.RenderTransformOrigin = new Point(0.5, 0.5);
element.RenderTransform = new RotateTransform(num);
}
};
}
public double Angle
{
get { return (double)GetValue(AngleProperty); }
set { SetValue(AngleProperty, value); }
}
public static readonly DependencyProperty AngleProperty =
DependencyProperty.RegisterAttached("Angle", typeof(double), typeof(CustomControl1), new PropertyMetadata(num, OnAngleChanged));
private static void OnAngleChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
num = (double)e.NewValue;
var element = obj as UIElement;
if (element != null)
{
element.RenderTransformOrigin = new Point(0.5, 0.5);
element.RenderTransform = new RotateTransform(num);
}
}
public class myDefaults : DefaultInitializer
{
public override void InitializeDefaults(ModelItem item)
{
item.Name = "myControl";
item.Properties["Angle"].SetValue("70.0");
}
}
}
}
<local:CustomControl1 x:Name="myControl" Angle="70.0" HorizontalAlignment="Left" Height="100" Margin="252,66,0,0" VerticalAlignment="Top" Width="100"/>