WPF-VS2019 Как настроить элемент управления, чтобы он имел значения по умолчанию при перетаскивании из панели инструментов в режим конструктора?

При перетаскивании моих пользовательских элементов управления в представление дизайна они просто вставляются пустыми в 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 =Текст

Я просмотрел исходный код TextBox.cs и не вижу никаких очевидных моментов, которые заставляли бы его делать это автоматически. Вот свойство зависимости и общедоступное свойство для TextBox Text.

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

Спасибо всем, кто прочитал это и может помочь.

Изменить: пример Syncfusion с SfTextInputLayout, когда я перетаскиваю это в представление дизайна, он автоматически добавляет дочерний элемент текстового поля и заполняет текст этого текстового поля Джоном.

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

Hint=name и Text=John автоматически добавлялись при перетаскивании элемента управления в представление дизайна. Я хотел бы сделать что-то подобное с моими элементами управления.


person wyattk    schedule 12.04.2021    source источник


Ответы (1)


@wyattk. Когда я перетаскиваю элемент управления в 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. Я создал свою программу в 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"/>

Результат: введите здесь описание изображения

person Hui Liu -MFST    schedule 13.04.2021
comment
Это не то, что я ищу. Спасибо за ответ, однако я ищу способ установить параметр Visual Studio элемента управления, как вы его назвали. Когда я перетаскиваю элемент управления синхронизацией во время разработки, он также выполняет аналогичную заливку. Я также обновлю основной пост примером синхронизации. - person wyattk; 14.04.2021
comment
Привет, @wyattk. Я обновил свой ответ, вы можете проверить его, если у вас есть какие-либо вопросы, пожалуйста, дайте мне знать. - person Hui Liu -MFST; 16.04.2021