簡體   English   中英

WPF-VS2019 從工具箱拖動到設計視圖時,如何自定義控件以使其具有默認值?

[英]WPF-VS2019 How do I customize a control to have default values when dragging from the toolbox into design view?

當將我的自定義控件拖到設計視圖中時,它只是將它放在 xaml.cs 中的空白處。

<MyCustomInputBoxView HorizontalAlignment="Left" Margin="167,103,0,0" VerticalAlignment="Top"/>

但是,當我從工具箱將文本框拖到設計視圖中時,它會在默認變量中撲通一聲,例如:

<TextBox HorizontalAlignment="Left" Margin="69,0,0,0" Text="TextBox" TextWrapping="Wrap" Width="120"/>

已在 xaml 中填寫。

如何為我自己的自定義控件設置這些默認值? 我到處尋找,甚至不知道要搜索什么來找到答案。

我希望我的控件在拖入設計視圖時看起來像這樣:

<MyCustomInputBoxView TextBoxContent="Text" Label="Text" HorizontalAlignment="Left" Margin="167,103,0,0" VerticalAlignment="Top"/>

類似於上面的 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
                                ));

    /// <summary>
    /// Contents of the TextBox.
    /// </summary>
    [DefaultValue("")]
    [Localizability(LocalizationCategory.Text)]
    public string Text
    {
        get { return (string) GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }

感謝任何閱讀本文並可以提供幫助的人。

編輯:帶有“SfTextInputLayout”的Syncfusion示例,當我將它拖到設計視圖上時,它會自動添加一個文本框子項並用“John”填充該文本框文本。

<Syncfusion:SfTextInputLayout Hint="Name">
        <TextBox Text="John"/>
</Syncfusion:SfTextInputLayout>

Hint="name" 和 Text="John" 是在控件拖到設計視圖時自動添加的。 我想用我的控件做類似的事情。

@懷亞特克。 當我將控件拖入 XAML 時,控件不顯示關聯的屬性。 而且我查閱了相關文檔,但沒有找到相關的設置。 這可能是控件的 Visual Studio 設置。 為了設置自定義控件屬性的默認值,我做了一個自定義控件,當它從“工具箱”拖到設計視圖中時,它有 DependencyProperty Angle 和一個默認值。 這是我的代碼,您可以參考它來設置自定義控件的默認值。

xaml 代碼:

<Grid>
        <local:MyControl Content="MyControl" HorizontalAlignment="Left" Margin="330,221,0,0"  VerticalAlignment="Top" Width="75"/>
</Grid>

自定義控制代碼:

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);
            }
        }
    }

更新:

為 VS 設計器提供默認值。 您可以嘗試使用DefaultInitializer class。 我在 Visual Studio Enterprise 2019 版本 16.9.3 中創建了我的程序。 請將 Microsoft.Windows.Design.Extensibility 和 Microsoft.Windows.Design.Interaction 添加到您的項目參考中。 步驟是:在你的程序中右鍵References,在彈出的對話框中右鍵select Add Reference…,然后在Reference Manager頁面中就可以找到select Assemblies,然后搜索依賴

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");
            }
        }

    }
}

然后將此控件拖放到設計上,您將在 XAML 中看到以下代碼:

<local:CustomControl1 x:Name="myControl" Angle="70.0" HorizontalAlignment="Left" Height="100" Margin="252,66,0,0" VerticalAlignment="Top" Width="100"/>

結果: 在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM