WPF C # Scrollviewer отключает кнопки панели инструментов - PullRequest
0 голосов
/ 17 ноября 2018

Я создаю приложение C # WPF.Я поместил Scrollviewer внутри ячейки сетки.Когда приложение запускается, и если я щелкаю где-нибудь внутри ячейки Scrollviewer, все кнопки панели инструментов, которые находятся в другой ячейке и управляются другим пользовательским элементом управления, внезапно отключаются и не включаются повторно.

Почему это происходит и как я могу это исправить?

Спасибо за любую помощь.

Вот мой код ScrollViewer:

            <ScrollViewer HorizontalScrollBarVisibility="Auto" 
                      VerticalScrollBarVisibility="Auto" 
                      Grid.Column="1" Grid.Row="1">
            <StackPanel x:Name="innerPanel" Grid.Column="1" 
                        Grid.Row="1" Orientation="Vertical">
            </StackPanel>
        </ScrollViewer>

И мой код панели инструментов:

   <ToolBarTray Grid.Row="1" Grid.ColumnSpan="2" Background="LightGray" >
        <ToolBar x:Name="toolbar" Background="LightGray" ToolBarTray.IsLocked="False">
            <Button Command="New" Content="New" />
            <Button Command="Open" Content="Open" />
            <Button Command="Save" Content="Save" />
            <Button Command="Cut" Content="Cut" />
            <Button Command="Copy" Content="Copy" />
            <Button Command="Paste" Content="Paste" />
            <Button Command="Record" Content="Record" />
            <Button Command="Play" Content="Play" />
            <Button Command="Pause" Content="Pause" />
            <Button Command="Stop" Content="Stop" />
            <Image Width="20" Margin="5,0"  Source="C:\VolumeIcon1.png"/>
            <Slider x:Name="VolumeControl" Maximum="100" Width="250"  
                    TickPlacement="BottomRight" Foreground="DarkGray" 
                    TickFrequency="1" IsSnapToTickEnabled="True"/>
            <TextBox Text="{Binding ElementName=VolumeControl, Path=Value, 
                UpdateSourceTrigger=PropertyChanged}" DockPanel.Dock="Right" 
                     TextAlignment="Right" Width="30" 
        </ToolBar>
    </ToolBarTray>

Вот некоторые изображения кнопок, когда они отключены и включены.

enter image description here enter image description here

Редактировать. Эти четыре файла должны воспроизводить основную версию проблемы, с которой я столкнулся.При щелчке по области Scrollviewer новая кнопка на моей панели инструментов отключается и становится серой.

MainWindow.xaml

<Window x:Class="UIMilestone.MainWindow" x:Name="window"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:UIMilestone"
    mc:Ignorable="d"
    SizeChanged="OnWindowSizeChanged"
    Title="MainWindow" Height="450" Width="800" Background="LightGray">
<Grid x:Name="mainGrid" ShowGridLines="True">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="5"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="5"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition x:Name="row0" Height="auto"/>
        <RowDefinition Height="*"/>
        <RowDefinition Height="20"/>
    </Grid.RowDefinitions>
    <ScrollViewer     HorizontalScrollBarVisibility="Auto" 
                      VerticalScrollBarVisibility="Auto" 
                      Grid.Column="1" Grid.Row="1">
    </ScrollViewer>
</Grid>

MainWindow.xaml.cs

namespace UIMilestone
{
    public partial class MainWindow : Window
    {
        //Links C# project to methods in c++

        public MainWindow()
        {
            InitializeComponent();
            mainGrid.Measure(new Size(800, 450));
            mainGrid.Arrange(new Rect(0, 0, 800, 450));

            TopToolbars tools = new TopToolbars(this);
            mainGrid.Children.Add(tools);

        }

        protected void OnWindowSizeChanged(object sender, SizeChangedEventArgs e)
        {
        }
    }
}

TopToolBars.xaml

<UserControl x:Class="UIMilestone.TopToolbars"
         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:local="clr-namespace:UIMilestone"
         mc:Ignorable="d" 
         d:DesignHeight="47" d:DesignWidth="790">
<UserControl.CommandBindings>
    <CommandBinding Command="New" CanExecute="New_CanExecute" />
</UserControl.CommandBindings>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="auto"/>
        <RowDefinition Height="auto"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="327.333"/>
        <ColumnDefinition Width="462.667"/>
    </Grid.ColumnDefinitions>

    <ToolBar x:Name="toolbar" Background="LightGray" ToolBarTray.IsLocked="False">
        <Button Command="New" Content="New" />
    </ToolBar>
</Grid>

TopToolBars.xaml.cs

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

namespace UIMilestone
{
public partial class TopToolbars : UserControl
{
    private MainWindow win;

    public TopToolbars(MainWindow mainWindowInst)
    {
        win = mainWindowInst;
        InitializeComponent();
        this.SetValue(Grid.RowProperty, 0);
        this.SetValue(Grid.ColumnProperty, 1);
    }

    private void New_CanExecute(object sender, CanExecuteRoutedEventArgs e)
    {
        e.CanExecute = true;
    }
}

}

1 Ответ

0 голосов
/ 19 ноября 2018

Это потому, что перенаправленная команда начинает свое путешествие с элемента с фокусом, поднимая визуальное дерево. Однако ваш элемент панели инструментов не находится в родительской цепочке innerPanel.

Вариант 1: явно указать элемент панели инструментов в качестве целевого объекта команды: Добавить CommandTarget = "{Binding RelativeSource = {RelativeSource Mode = FindAncestor, AncestorType = local: TopToolbar}}" к вашей кнопке

Вариант 2: поместите привязку вашей команды в MainWindow.

Вариант 3. Использование MVVM: создайте свойство ICommand в модели представления и Command = "{Binding MyCommand}" на кнопке

...