Команда кнопки в ControlTemplate внутри ResourceDictionary - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь добавить привязку команд к моей кнопке в словаре ресурсов. У меня есть глобальный стиль, разработанный для всего приложения, и все, что я хочу, это добавить кнопку с командой, которая открывает экранную клавиатуру для всех текстовых полей. Мой код ниже:

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         <Style TargetType="{x:Type TextBox}">
<Setter.Value>
                <ControlTemplate>
                    <Border BorderThickness="0">
                        <StackPanel Orientation="Horizontal">
                            <ScrollViewer Width="150" />
                            <Popup x:Name="icon" IsOpen="False" HorizontalAlignment="Right">
                                <Button BorderThickness="1" Visibility="Visible" Command="{*..and now I want to bind my command...*}">
                                </Button>
                            </Popup>
                        </StackPanel>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsKeyboardFocused" Value="True">
                            <Setter Property="IsOpen" TargetName="icon" Value="True" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Может кто-нибудь помочь решить проблему?

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Вы можете привязать свою кнопку, используя PlacementTarget

<Button BorderThickness="1" Visibility="Visible" Command="{*..and now I want to bind my command...*}" DataContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}"/>

И позже в коде нужно указать тег, он ищет окно, но вы можете изменить anecestorType.

<TextBox Tag="{Binding DataContext, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />

Конечно, в вашей ViewModel (DataContext) вы должны указать правильную команду.

0 голосов
/ 16 января 2019

Что вы хотите сделать, это создать пользовательский элемент управления, содержащий текстовое поле с обработчиком событий для события «GotFocus», запускающим osk.exe, и обработчик событий «Lostfocus», завершающий osk.exe, следующим образом:

<UserControl [...] >
    <Grid Background="White">
        <TextBlock GotFocus="ShowKeyboard" LostFocus="HideKeyboard"/>
    </Grid>
</UserControl>

    private void ShowKeyboard(object sender, RoutedEventArgs e)
    {
        //run osk.exe
    }

    private void HideKeyboard(object sender, RoutedEventArgs e)
    {
        //terminate osk.exe
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...