keyBinding не работает, пока кнопка не нажата - PullRequest
0 голосов
/ 30 октября 2019

Пользовательский контроль должен добавляться каждый раз при нажатии на ярлык. Но когда я закрываю пользовательский контроль и пытаюсь открыть его снова, ярлык не работает. Фокус находится где-то еще. Когда какая-то кнопка нажата в окне и нажата комбинация клавиш, добавляется usercontrol.

UserControl 1:

<Window
    x:class="Class1"
    ...>    
    <Window.InputBindings>
        <KeyBinding Command="ButtonCLickCommand "
                    Modifiers="Control" Key="Q"/>
    </Window.InputBindings>
    <Grid x:Name="Grid">
        <Button Content = "OpenUserControl" Command="ButtonCLickCommand "/>
        <Button Content = "Temp"/>
    </Grid>
</Window>

CodeBehind:

public ICommand ProfileCommand { get; set; }
ProfileCommand = new RelayCommand(Button_Click());

public void Button_Click()
{            
     _control = new Class2();
     _control.CloseAction = CloseClass2;
     Panel.SetZIndex(_control, 10);
     _control.Width = 200;
     _control.Height = 200;
     Grid.Children.Add(_control);
}
public void CloseClass2(Class2 control)
{
     Grid.Children.Remove(control);            
}

UserControl 2:

<UserControl
    x:class="Class2"
    ...>    
    <StackPanel>
        <Button Content="x" Click="Button_Click" Height="30">
        <Rectangle Fill="Black" Height="70"/>
    </StackPanel>
</UserControl>

Код позади:

namespace namespace1.UserControls
{
    /// <summary>
    /// Interaction logic for ProfileUserControl.xaml
    /// </summary>
    public partial class Class2 : UserControl
    {
        public Action<Class2> CloseAction;

        public Class2()
        {           
            InitializeComponent();
        }

        private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            CloseAction(this);
        }
    }
}

Это схема моего кода. Помоги мне, я новичок в WPF. Спасибо за каждый ответ, который я получаю. :)

1 Ответ

0 голосов
/ 30 октября 2019

В KeyBinding ... вам нужно привязать свою команду в модели View ... чтобы упростить ее ... она не включает модель представления ... вот решение, обратите внимание, что для простоты я сделал несколько настроек:

в mainWindow.xaml:

 <Window.InputBindings>
    <KeyBinding Command="{Binding ButtonClickCommand,RelativeSource{RelativeSource FindAncestor,AncestorType=Window}}" Modifiers="Control" Key="Q"/>
    </Window.InputBindings>

    <StackPanel x:Name="MainGrid">
    <Button Content = "OpenUserControl" Command="{Binding ButtonClickCommand,RelativeSource={RelativeSource FindAncestor,AncestorType=Window}}"/>
    </StackPanel>

и вот код:

 public partial class MainWindow : Window
    {
    public RelayCommand ButtonClickCommand { get; set; }
    public MainWindow()
    {
    InitializeComponent();
    ButtonClickCommand= new RelayCommand(MyButtonClickExcute);
    }
    private void MyButtonClickExcute()
    {
    UserControl1 userControl1 = new UserControl1 {Width = 50, Height = 50,CloseAction = RemoveUserControlFromPanel };
    Panel.SetZIndex(userControl1, 10);
    MainGrid.Children.Add(userControl1);
    }
    public void RemoveUserControlFromPanel(UserControl1 userControl1)
    {
    MainGrid.Children.Remove(userControl1);
    }
    }

и для userControl.xaml:

<Grid>
<Border Background="Blue" CornerRadius="10" BorderThickness="15" BorderBrush="Green">
                <Button VerticalAlignment="Center" HorizontalAlignment="Center" Width="125" Height="75" Content="Close" Click="ButtonBase_OnClick"></Button>
</Border>
</Grid>

наконец, код для userControl:

 public partial class UserControl1 : UserControl
    {
        public Action<UserControl1> CloseAction { get; set; }
        public UserControl1()
        {
            InitializeComponent();
        }

        private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
        {
            CloseAction(this);
        }
    }
...