ResourceDictionary内部的ControlTemplate中的按钮命令

时间:2019-01-16 11:57:53

标签: c# wpf xaml

我正在尝试将Command绑定添加到资源字典中的按钮。我为整个应用程序设计了全局样式,我想要的只是添加带有命令的按钮,该按钮可在屏幕上打开所有文本框的键盘。 我的代码如下:

    <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 :(得分:0)

您想要做的是创建一个用户控件,其中包含一个文本框,该框带有一个针对osk.exe开始的“ GotFocus”事件的事件处理程序,以及一个终止osk.exe的事件处理程序“ Lostfocus”,如下所示:

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

答案 1 :(得分:0)

您可以使用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)中,您需要指定正确的命令。