Я не вижу способа, который бы не был "хаккейным", что бы я делал, я бы сделал событие, которое фиксирует щелчки левой / правой кнопкой мыши и немедленно возвращает результат.
И для каждого элемента управления, который будет недоступен для пользователя, вы можете связать команду с помощью диспетчера команд, чтобы принять только ввод средней мыши или создать событие, когда пользователь нажимает среднюю кнопку мыши.
Я буду рад создать несколько примеров, если вы что-то не поняли.
Давайте возьмем Mainwindow view и добавим событие на верхнем уровне иерархии окон
<Window x:Class="test.MainWindow"
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:test"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800"
<!-- This event captures every mouse down action that is clicked
Inside the window -->
PreviewMouseDown="Window_PreviewMouseDown">
<Grid>
</Grid>
</Window>
Код позади MainWindow
/// <summary>
/// This event will also capture any event, But this time you can check if the mouse button clicked is the middle mouse. /// For now we will just return out of the method
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Window_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
// If the pressed mouse button is either the left or right button
if(e.ChangedButton == MouseButton.Left || e.ChangedButton == MouseButton.Right)
{
// Exit out of the method
return;
};
}
/// <summary>
/// This event will capture every mouse down event, You can add any logic to it.
/// For now we will just return out of the method
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button_MouseWheel(object sender, MouseButtonEventArgs e)
{
// If the pressed mouse button is the middle
if(e.ChangedButton == MouseButton.Middle)
{
// do stuff...
};
}
Другой элемент управления
<!-- This is what you normally do -->
<Button Click="Button_Click"/>
<!-- Or -->
<Button Command="{Binding MyComamnd}"/>
<!-- This you will need to do for every interactable control -->
<Button MouseDown="Button_MouseWheel"/>
<!-- Or -->
<Button>
<!-- Bind to an MVVM input command -->
<Button.InputBindings>
<MouseBinding Command="{Binding MyCommand}"
MouseAction="MiddleClick"/>
</Button.InputBindings>
</Button>
Чтобы создать ScrollViewer
<ScrollViewer VerticalScrollBarVisibility="Visible">
<!-- Use any kind of item panel here, I am using a stack panel
But you can also use a grid with a Grid.RowDefenition -->
<StackPanel>
<Button Height="50" MouseDown="Button_MouseDown"/>
<Button Height="50"/>
<Button Height="50"/>
<Button Height="50"/>
<Button Height="50"/>
</StackPanel>
</ScrollViewer>