0

У меня есть TabPanel внутри ScrollViewer.WPF отключить MouseEnter триггер для детей

<ScrollViewer x:Name="ScrollViewer" VerticalScrollBarVisibility="Disabled" HorizontalScrollBarVisibility="Hidden"> 
    <TabPanel x:Name="HeaderPanel" IsItemsHost="True" Panel.ZIndex="1" KeyboardNavigation.TabIndex="1" Background="Red"/> 
</ScrollViewer> 

Я хочу вызвать функцию каждый раз, когда мышь вводит/покидает ScrollViewer.

Если я использую это так:

ScrollViewer sv = GetTemplateChild("ScrollViewer") as ScrollViewer; 
sv.MouseEnter += sv_MouseEnter; 

функция быть tirggered даже если я вхожу в область TabItem's контента.
Как это можно решить?

EDIT:
Я расскажу вам об этом изображении ниже. Я хочу вызвать MouseEnter, когда пользователь вводит область, определенную красной рамкой (это ScrollViewer).

Но в действительности, когда я использую код выше, когда я вхожу в TabControl, он записывает MouseEnter.

enter image description here

EDIT 2:
на основе ответа Шеридана, вот моя XAML.

мой MainWindow.xaml:

<Window x:Class="WpfApplication26.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <TabControl Style="{DynamicResource TabControlStyle1}" > 
      <TabItem Header="TabItem"> 
       <Grid Background="#FFE5E5E5"/> 
      </TabItem> 
      <TabItem Header="TabItem"> 
       <Grid Background="#FFE5E5E5"/> 
      </TabItem> 
      <TabItem Header="TabItem"> 
       <Grid Background="#FFE5E5E5"/> 
      </TabItem> 
      <TabItem Header="TabItem"> 
       <Grid Background="#FFE5E5E5"/> 
      </TabItem> 
      <TabItem Header="TabItem"> 
       <Grid Background="#FFE5E5E5"/> 
      </TabItem> 
      <TabItem Header="TabItem"> 
       <Grid Background="#FFE5E5E5"/> 
      </TabItem> 
      <TabItem Header="TabItem"> 
       <Grid Background="#FFE5E5E5"/> 
      </TabItem> 
      <TabItem Header="TabItem"> 
       <Grid Background="#FFE5E5E5"/> 
      </TabItem> 
      <TabItem Header="TabItem"> 
       <Grid Background="#FFE5E5E5"/> 
      </TabItem> 
      <TabItem Header="TabItem"> 
       <Grid Background="#FFE5E5E5"/> 
      </TabItem> 
      <TabItem Header="TabItem"> 
       <Grid Background="#FFE5E5E5"/> 
      </TabItem> 
      <TabItem Header="TabItem"> 
       <Grid Background="#FFE5E5E5"/> 
      </TabItem> 
     </TabControl> 
    </Grid> 
</Window> 

мой App.xaml:

<Application x:Class="WpfApplication26.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      StartupUri="MainWindow.xaml"> 
    <Application.Resources> 

     <SolidColorBrush x:Key="TabControlNormalBorderBrush" Color="#8C8E94"/> 
     <Style x:Key="TabControlStyle1" TargetType="{x:Type TabControl}"> 
      <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> 
      <Setter Property="Padding" Value="4,4,4,4"/> 
      <Setter Property="BorderThickness" Value="1"/> 
      <Setter Property="BorderBrush" Value="{StaticResource TabControlNormalBorderBrush}"/> 
      <Setter Property="Background" Value="#F9F9F9"/> 
      <Setter Property="HorizontalContentAlignment" Value="Center"/> 
      <Setter Property="VerticalContentAlignment" Value="Center"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type TabControl}"> 
         <Grid ClipToBounds="true" SnapsToDevicePixels="true" KeyboardNavigation.TabNavigation="Local"> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition x:Name="ColumnDefinition0"/> 
           <ColumnDefinition x:Name="ColumnDefinition1" Width="0"/> 
          </Grid.ColumnDefinitions> 
          <Grid.RowDefinitions> 
           <RowDefinition x:Name="RowDefinition0" Height="Auto"/> 
           <RowDefinition x:Name="RowDefinition1" Height="*"/> 
          </Grid.RowDefinitions> 
          <ScrollViewer> 
           <TabPanel x:Name="HeaderPanel" Grid.Column="0" IsItemsHost="true" Margin="2,2,2,0" Grid.Row="0" KeyboardNavigation.TabIndex="1" Panel.ZIndex="1"/> 
           <ScrollViewer.Style> 
            <Style> 
             <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Hidden" /> 
             <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Disabled" /> 
             <Style.Triggers> 
              <Trigger Property="UIElement.IsMouseOver" Value="True"> 
               <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Visible" /> 
              </Trigger> 
             </Style.Triggers> 
            </Style> 
           </ScrollViewer.Style> 
          </ScrollViewer> 

          <Border x:Name="ContentPanel" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Grid.Column="0" KeyboardNavigation.DirectionalNavigation="Contained" Grid.Row="1" KeyboardNavigation.TabIndex="2" KeyboardNavigation.TabNavigation="Local"> 
           <ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
          </Border> 
         </Grid> 
         <ControlTemplate.Triggers> 
          <Trigger Property="TabStripPlacement" Value="Bottom"> 
           <Setter Property="Grid.Row" TargetName="HeaderPanel" Value="1"/> 
           <Setter Property="Grid.Row" TargetName="ContentPanel" Value="0"/> 
           <Setter Property="Height" TargetName="RowDefinition0" Value="*"/> 
           <Setter Property="Height" TargetName="RowDefinition1" Value="Auto"/> 
           <Setter Property="Margin" TargetName="HeaderPanel" Value="2,0,2,2"/> 
          </Trigger> 
          <Trigger Property="TabStripPlacement" Value="Left"> 
           <Setter Property="Grid.Row" TargetName="HeaderPanel" Value="0"/> 
           <Setter Property="Grid.Row" TargetName="ContentPanel" Value="0"/> 
           <Setter Property="Grid.Column" TargetName="HeaderPanel" Value="0"/> 
           <Setter Property="Grid.Column" TargetName="ContentPanel" Value="1"/> 
           <Setter Property="Width" TargetName="ColumnDefinition0" Value="Auto"/> 
           <Setter Property="Width" TargetName="ColumnDefinition1" Value="*"/> 
           <Setter Property="Height" TargetName="RowDefinition0" Value="*"/> 
           <Setter Property="Height" TargetName="RowDefinition1" Value="0"/> 
           <Setter Property="Margin" TargetName="HeaderPanel" Value="2,2,0,2"/> 
          </Trigger> 
          <Trigger Property="TabStripPlacement" Value="Right"> 
           <Setter Property="Grid.Row" TargetName="HeaderPanel" Value="0"/> 
           <Setter Property="Grid.Row" TargetName="ContentPanel" Value="0"/> 
           <Setter Property="Grid.Column" TargetName="HeaderPanel" Value="1"/> 
           <Setter Property="Grid.Column" TargetName="ContentPanel" Value="0"/> 
           <Setter Property="Width" TargetName="ColumnDefinition0" Value="*"/> 
           <Setter Property="Width" TargetName="ColumnDefinition1" Value="Auto"/> 
           <Setter Property="Height" TargetName="RowDefinition0" Value="*"/> 
           <Setter Property="Height" TargetName="RowDefinition1" Value="0"/> 
           <Setter Property="Margin" TargetName="HeaderPanel" Value="0,2,2,2"/> 
          </Trigger> 
          <Trigger Property="IsEnabled" Value="false"> 
           <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 

    </Application.Resources> 
</Application> 

не работает должным образом (описано в первом редактировать), даже если он говорит, что делает ...

+0

Не могли бы вы объяснить свою проблему более четко ... где это 'TabItem'? – Sheridan

+0

Я предполагаю, что вам придется жить с этой проблемой, так как событие бурлит вверх по дереву, чтобы наконец добраться до вашего обработчика. Другой вопрос, хотите ли вы запускать функцию каждый раз, когда мышь вводит/покидает ScrollBar или ScrollViewer? – sthotakura

+0

@sthotakura Я верю, что мое редактирование отвечает на ваш вопрос, но я отвечу здесь также - я хочу вызвать функцию, когда мышь входит/покидает ScrollViewer – Ron

ответ

1

Хорошо ... вот почему вы всегда должны показывать нам, какова ваша общая цель. Если бы я не спросил об этом, тогда у вас может не получиться ответа, потому что вы изначально смотрели не в то место. Правильно, читайте лекцию, отвечая на вопрос.

Как бы то ни было, это хорошо и просто ... нам не нужно обрабатывать какие-либо события, мы можем просто использовать Trigger в ScrollViewer.Style. Просто добавьте в ваш ScrollViewer (убедившись, что вы удалить ваши ScrollBar свойства из ScrollViewer определения):

<ScrollViewer x:Name="ScrollViewer"> 
    ... 
    <ScrollViewer.Style> 
     <Style> 
      <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" 
       Value="Disabled" /> 
      <Setter Property="ScrollViewer.VerticalScrollBarVisibility" 
       Value="Disabled" /> 
      <Style.Triggers> 
       <Trigger Property="UIElement.IsMouseOver" Value="True"> 
        <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" 
         Value="Visible" /> 
        <Setter Property="ScrollViewer.VerticalScrollBarVisibility" 
         Value="Visible" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </ScrollViewer.Style> 
</ScrollViewer> 

UPDATE >>>

Хорошо, я, наконец, полностью понимаю ваш вопрос сейчас .. извините за то, что так медленно. Однако у вас есть настоящая проблема, потому что это не ошибка, это спроектированное поведение. Это связано с тем, что элементы управления TabItem: внутриScrollViewer управление, поэтому перемещение мыши над ними такое же, как перемещение их по ScrollViewer.

Если я пытался выполнить ваши требования, я бы вообще отказался от TabControl и просто использовал элементы управления RadioButton, которые вместо этого загружают виды в нижнюю зону. Вы могли бы даже нарисовать свой RadioButton s, чтобы выглядеть как вкладки, если хотите.


UPDATE 2 >>>

Ну, это длинная история с несколькими частями. У меня нет времени на то, чтобы напечатать здесь все, но я расскажу вам об этом ненадолго. В первую очередь вам нужно будет создать новый ControlTemplate для RadioButton s и можете добавить их в StackPanel с помощью свойства Orientation, установленной в True, а затем положить это в ваш ScrollViewer.

Далее, вам нужно определить enum с одним значением для каждого «на вкладке» или вид и EnumToBoolConverter ... Я нашел хороший пример для вас в How to bind RadioButtons to an enum? пост.

Следующее задание - создать область содержимого табуляции. Для этого вам понадобится ContentControl для отображения каждого вида или содержимого элемента табуляции. Идея состоит в том, что у вас есть абстрактный класс BaseViewModel, который реализует интерфейс INotifyPropertyChanged и класс, который расширяет этот базовый класс для каждой вкладки, которую вы хотите отобразить. Каждый класс предоставит все свойства и функциональные возможности данных, которые связаны с соответствующим представлением или вкладкой.

Поскольку все они расширяют базовый класс, вы можете иметь свойство такого типа, которое вы можете установить для каждой из моделей расширенного просмотра. Здесь начинается игра ContentControl, так как она связывается с собственностью BaseViewModel.

Заключительная часть предназначена для определения DataTemplate для каждого класса модели вида, который просто отображает соответствующий вид. Затем, когда выбраны различные RadioButton s, вы можете просто установить свойство BaseViewModel соответствующей модели представления, которая приведет к отображению парного представления. Вы можете увидеть более полное объяснение с примерами кода в своем ответе на сообщение WPF MVVM navigate views.

+0

Такая же проблема, как моя оригинальная проблема. Вы сделали именно то, что я хотел сделать, но используя XAML вместо кода ... но проблема остается такой же. – Ron

+0

Я не знаю, что вы сделали с этим кодом, но пример кода, который я только запускал в новом проекте работал просто отлично. Удалили ли вы ненужный обработчик событий «MouseEnter»? – Sheridan

+0

ofcouse, я отредактирую свой пост с помощью своего xaml, чтобы вы могли видеть – Ron

 Смежные вопросы

  • Нет связанных вопросов^_^