Установите целевое свойство метки на объект в пользовательском элементе управления UserControl. - PullRequest
2 голосов
/ 09 июля 2020

Простое окно только с меткой и настраиваемым элементом управления. Когда Path=ValueContainer включен и используется клавиша доступа, он издает звук уведомления windows, но фокус не помещается в текстовое поле. Использование F12 (Go To Definition) работает и обеспечивает переход к TextBox.

Если Path=ValueContainer опущено, звук не воспроизводится и фокус не изменяется.

<Window x:Class="DebuggingSearchBoxAccessKey.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:DebuggingAccessKey"
        Title="MainWindow" Height="200" Width="200">
    <StackPanel Orientation="Horizontal">
        <Label Content="_Testing"
               Target="{Binding ElementName=searchBox, Path=ValueContainer}" />
        <local:SearchBox x:Name="searchBox" />
    </StackPanel>
</Window>

Пользовательский элемент управления содержащий TextBox Я хочу привязать ключ доступа к.

<UserControl x:Class="DebuggingAccessKey.SearchBox"
             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:i="http://schemas.microsoft.com/expression/2010/interactivity"
             xmlns:local="clr-namespace:DebuggingAccessKey"
             mc:Ignorable="d" 
             d:DesignHeight="20" d:DesignWidth="100">
    <Grid>
        <TextBox x:Name="ValueContainer"
                 Text="Bazzle"/>
    </Grid>
</UserControl>

Я также реализовал свойство Text, насколько я понимаю, как DependencyProperty.

public partial class SearchBox : UserControl
{
    public SearchBox()
    {
        InitializeComponent();
    }

    public static readonly DependencyProperty TextDependencyProperty = DependencyProperty.Register(nameof(Text), typeof(string), typeof(SearchBox));

    public string Text
    {
        get => (string)GetValue(TextDependencyProperty);
        set => SetValue(TextDependencyProperty, value);
    }
}

Привязка к стандартному текстовому полю работает, как показано ниже. Таким образом, я предполагаю, что мне не хватает очевидного, что нужно для настраиваемого элемента управления ...

<StackPanel Orientation="Horizontal">
    <Label Content="_Foo" Target="{Binding ElementName=bar}" />
    <TextBox x:Name="bar" />
</StackPanel>

Ответы [ 2 ]

1 голос
/ 09 июля 2020
• 1000 , хотя это несколько сложнее.
1 голос
/ 09 июля 2020

Привязки могут быть созданы только для СВОЙСТВ. Но элементы пользовательского интерфейса, вложенные в UserControl, являются ПОЛЯ.

Попробуйте добавить свойство.

XAML:

<UserControl x:Class="DebuggingAccessKey.SearchBox"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d" 
             d:DesignHeight="20" d:DesignWidth="100">
    <Grid>
        <TextBox x:Name="PART_ValueContainer"
                 Text="Bazzle"/>
    </Grid>
</UserControl>

Код позади:

using System.Windows;
using System.Windows.Controls;

namespace DebuggingAccessKey
{
    /// <summary>Interaction logic for SearchBox.xaml</summary>
    public partial class SearchBox : UserControl
    {
        public SearchBox()
        {
            InitializeComponent();
            ValueContainer = PART_ValueContainer;
        }

        public TextBox ValueContainer
        {
            get { return (TextBox)GetValue(ValueContainerProperty); }
            private set { SetValue(ValueContainerPropertyKey, value); }
        }

        // Use DependencyPropertyKey to create a read-only DependencyProperty ValueContainerProperty.
        private static readonly DependencyPropertyKey ValueContainerPropertyKey =
            DependencyProperty.RegisterReadOnly(nameof(ValueContainer), typeof(TextBox), typeof(SearchBox), new PropertyMetadata(null));


        // Using a DependencyProperty as the backing store for ValueContainer.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty ValueContainerProperty = ValueContainerPropertyKey.DependencyProperty;

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...