c# – WPF单击按钮Scrollviewer
发布时间:2020-12-15 22:37:37 所属栏目:百科 来源:网络整理
导读:我有一个问题,我在StackPanel内有一个菜单,这是在ScrollViewer内部.现在,即使水平滚动条被隐藏,也可以水平滚动.现在的主要问题是,我无法为按钮制作Clickevent.似乎我的Scroll Event阻止了它下面的东西. XAML代码 Grid Grid.ColumnDefinitions ColumnDefiniti
我有一个问题,我在StackPanel内有一个菜单,这是在ScrollViewer内部.现在,即使水平滚动条被隐藏,也可以水平滚动.现在的主要问题是,我无法为按钮制作Clickevent.似乎我的Scroll Event阻止了它下面的东西.
XAML代码 <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="200"/> <ColumnDefinition Width="*"/> <ColumnDefinition Width="200"/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="110"/> <RowDefinition Height="*"/> <RowDefinition Height="100"/> </Grid.RowDefinitions> <Rectangle x:Name="rectangel1" Grid.RowSpan="3"> <Rectangle.Fill> <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> <GradientStop Color="#FF0036A0" Offset="0.003"/> <GradientStop Color="#FFE9EDFF" Offset="1"/> </LinearGradientBrush> </Rectangle.Fill> </Rectangle> <Grid Grid.Column="1" Grid.ColumnSpan="2"> <Grid.ColumnDefinitions> <ColumnDefinition Width="20"/> <ColumnDefinition Width="750"/> <ColumnDefinition Width="20"/> </Grid.ColumnDefinitions> <ScrollViewer x:Name="scrollviewer1" Grid.Column="1" Grid.ColumnSpan="2" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Disabled" PanningMode="HorizontalOnly" MouseUp="UIElement_OnMouseUp" PreviewMouseLeftButtonDown="UIElement_OnPreviewMouseLeftButtonDown" PreviewMouseMove="UIElement_OnPreviewMouseMove" Cursor="Hand"> <StackPanel Orientation="Horizontal" Grid.Column="1" Grid.ColumnSpan="1"> <Grid Width="87" Height="90" Margin="10,10,10"> <Rectangle x:Name="btn1" Fill="#FFF39999" RadiusX="10" RadiusY="10" /> <Label Content="No Btn 1" HorizontalAlignment="Center" VerticalAlignment="Bottom" FontSize="16" FontWeight="Bold"/> </Grid> <Grid Width="87" Height="90" Margin="10,10"> <Rectangle x:Name="btn2" Fill="#FFF39999" RadiusX="10" RadiusY="10" /> <Label Content="No Btn 2" HorizontalAlignment="Center" VerticalAlignment="Bottom" FontSize="16" FontWeight="Bold"/> </Grid> <!--<Grid Width="87" Height="90" Margin="10,10"> <Rectangle x:Name="btn3" Fill="#FFF39999" RadiusX="10" RadiusY="10" /> <Label Content="Station 3" HorizontalAlignment="Center" VerticalAlignment="Bottom" FontSize="16" FontWeight="Bold"/> </Grid>--> <Grid Width="87" Height="90" Margin="10,10"> <Button x:Name="btn3" Content="Station 3" Click="btn3_Click" Style="{DynamicResource ButtonStyle1}" > <Button.Resources> <Style x:Key="ButtonFocusVisual"> <Setter Property="Control.Template"> <Setter.Value> <ControlTemplate> <Rectangle Margin="2" SnapsToDevicePixels="true" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeThickness="1" StrokeDashArray="1 2"/> </ControlTemplate> </Setter.Value> </Setter> </Style> <LinearGradientBrush x:Key="ButtonNormalBackground" EndPoint="0,1" StartPoint="0,0"> <GradientStop Color="#F3F3F3" Offset="0"/> <GradientStop Color="#EBEBEB" Offset="0.5"/> <GradientStop Color="#DDDDDD" Offset="0.5"/> <GradientStop Color="#CDCDCD" Offset="1"/> </LinearGradientBrush> <SolidColorBrush x:Key="ButtonNormalBorder" Color="#FF707070"/> <Style x:Key="ButtonStyle1" TargetType="{x:Type Button}"> <Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}"/> <Setter Property="Background" Value="{StaticResource ButtonNormalBackground}"/> <Setter Property="BorderBrush" Value="{StaticResource ButtonNormalBorder}"/> <Setter Property="BorderThickness" Value="1"/> <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> <Setter Property="HorizontalContentAlignment" Value="Center"/> <Setter Property="VerticalContentAlignment" Value="Center"/> <Setter Property="Padding" Value="1"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Button}"> <Grid> <Rectangle Fill="#FFFFA6A6" RadiusY="10" RadiusX="10"/> <Label x:Name="label" Content="BUTTON" HorizontalAlignment="Center" VerticalAlignment="Bottom" FontSize="16" FontWeight="Bold"/> </Grid> <ControlTemplate.Triggers> <Trigger Property="IsKeyboardFocused" Value="true"/> <Trigger Property="ToggleButton.IsChecked" Value="true"/> <Trigger Property="IsEnabled" Value="false"> <Setter Property="Foreground" Value="#ADADAD"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </Button.Resources> </Button> </Grid> <Grid Width="87" Height="90" Margin="10,10"> <Rectangle x:Name="btn4" Fill="#FFF39999" RadiusX="10" RadiusY="10" /> <Label Content="No Btn 4" HorizontalAlignment="Center" VerticalAlignment="Bottom" FontSize="16" FontWeight="Bold"/> </Grid> <Grid Width="87" Height="90" Margin="10,10"> <Rectangle x:Name="btn5" Fill="#FFF39999" RadiusX="10" RadiusY="10" /> <Label Content="No Btn 5" HorizontalAlignment="Center" VerticalAlignment="Bottom" FontSize="16" FontWeight="Bold"/> </Grid> <Grid Width="87" Height="90" Margin="10,10"> <Rectangle x:Name="btn6" Fill="#FFF39999" RadiusX="10" RadiusY="10" /> <Label Content="No Btn 6" HorizontalAlignment="Center" VerticalAlignment="Bottom" FontSize="16" FontWeight="Bold"/> </Grid> <Grid Width="87" Height="90" Margin="10,10"> <Rectangle x:Name="btn7" Fill="#FFF39999" RadiusX="10" RadiusY="10" /> <Label Content="No Btn 7" HorizontalAlignment="Center" VerticalAlignment="Bottom" FontSize="16" FontWeight="Bold"/> </Grid> <Grid Width="87" Height="90" Margin="10,10"> <Rectangle x:Name="btn8" Fill="#FFF39999" RadiusX="10" RadiusY="10" /> <Label Content="No Btn 8" HorizontalAlignment="Center" VerticalAlignment="Bottom" FontSize="16" FontWeight="Bold"/> </Grid> <Grid Width="87" Height="90" Margin="10,50,10"> <Button x:Name="btn9" Content="Station 9" Click="btn9_Click" Style="{DynamicResource ButtonStyle1}" > <Button.Resources> <Style x:Key="ButtonFocusVisual"> <Setter Property="Control.Template"> <Setter.Value> <ControlTemplate> <Rectangle Margin="2" SnapsToDevicePixels="true" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeThickness="1" StrokeDashArray="1 2"/> </ControlTemplate> </Setter.Value> </Setter> </Style> <LinearGradientBrush x:Key="ButtonNormalBackground" EndPoint="0,0"> <GradientStop Color="#F3F3F3" Offset="0"/> <GradientStop Color="#EBEBEB" Offset="0.5"/> <GradientStop Color="#DDDDDD" Offset="0.5"/> <GradientStop Color="#CDCDCD" Offset="1"/> </LinearGradientBrush> <SolidColorBrush x:Key="ButtonNormalBorder" Color="#FF707070"/> <Style x:Key="ButtonStyle1" TargetType="{x:Type Button}"> <Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}"/> <Setter Property="Background" Value="{StaticResource ButtonNormalBackground}"/> <Setter Property="BorderBrush" Value="{StaticResource ButtonNormalBorder}"/> <Setter Property="BorderThickness" Value="1"/> <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> <Setter Property="HorizontalContentAlignment" Value="Center"/> <Setter Property="VerticalContentAlignment" Value="Center"/> <Setter Property="Padding" Value="1"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Button}"> <Grid> <Rectangle Fill="#FFFFA6A6" RadiusY="10" RadiusX="10"/> <Label x:Name="label" Content="Button 9" HorizontalAlignment="Center" VerticalAlignment="Bottom" FontSize="16" FontWeight="Bold"/> </Grid> <ControlTemplate.Triggers> <Trigger Property="IsKeyboardFocused" Value="true"/> <Trigger Property="ToggleButton.IsChecked" Value="true"/> <Trigger Property="IsEnabled" Value="false"> <Setter Property="Foreground" Value="#ADADAD"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </Button.Resources> </Button> </Grid> </StackPanel> </ScrollViewer> <Rectangle x:Name="rectlinks" Grid.Column="0" Fill="#FFFF7676" MouseEnter="rectlinks_MouseEnter" /> <Rectangle x:Name="rectrechts" Grid.Column="2" MouseEnter="rectrechts_MouseEnter" Fill="#FFFF7474" /> </Grid> <Label x:Name="label1" Content="Wert"/> <Label x:Name="label2" Content="mehr" Margin="0,0"/> </Grid> C#代码 using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace ScrollMenue { /// <summary> /// Interaktionslogik für MainWindow.xaml /// </summary> public partial class MainWindow : Window { private double hOff; public MainWindow() { InitializeComponent(); } private void rectrechts_MouseEnter(object sender,MouseEventArgs e) { label1.Content = "rechts"; scrollviewer1.LineRight(); } private void rectlinks_MouseEnter(object sender,MouseEventArgs e) { if (rectlinks.IsMouSEOver == true) { scrollviewer1.ScrollToHorizontalOffset(scrollviewer1.HorizontalOffset + 10); label1.Content = "links"; scrollviewer1.LineLeft(); } } private Point scrollMousePoint; private void UIElement_OnMouseUp(object sender,MouseButtonEventArgs e) { scrollviewer1.ReleaseMouseCapture(); } private void UIElement_OnPreviewMouseLeftButtonDown(object sender,MouseButtonEventArgs e) { scrollviewer1.CaptureMouse(); scrollMousePoint = e.GetPosition(scrollviewer1); hOff = scrollviewer1.HorizontalOffset; } private void UIElement_OnPreviewMouseMove(object sender,MouseEventArgs e) { if (scrollviewer1.IsMouseCaptured) { scrollviewer1.ScrollToHorizontalOffset(hOff + (scrollMousePoint.X - e.GetPosition(scrollviewer1).X)); } } private void btn9_Click(object sender,RoutedEventArgs e) { label2.Content = "Click"; } private void btn3_Click(object sender,RoutedEventArgs e) { label2.Content = "Click"; } } } 解决方法
我找到了你的解决方案
我只是按一个按钮,但你可以为所有人做, private void UIElement_OnPreviewMouseLeftButtonDown(object sender,MouseButtonEventArgs e) { if (e.Source == btn3) { btn3_Click(sender,e); } scrollMousePoint = e.GetPosition(scrollviewer1); hOff = scrollviewer1.HorizontalOffset; scrollviewer1.CaptureMouse(); } private void btn9_Click(object sender,RoutedEventArgs e) { label2.Content = "i AM WORKING"; //You can press and still scroll } 更新: 从你说的评论你现在想要触摸时不要触发按钮,因为你可能只想滚动,你需要实现某种类型的逻辑,如一个保持手势,这里是一个帖子 Do WPF have Touch-and-Hold gesture? 更新2: 我做到了,这是一个非常简单的解决方案, 在xaml中为PreviewMouseLeftButtonUp添加另一个处理程序,然后在代码后面(c#)执行此操作: private DateTime mouseTimer; private void UIElement_OnPreviewMouseLeftButtonDown(object sender,MouseButtonEventArgs e) { mouseTimer = DateTime.Now; scrollviewer1.CaptureMouse(); scrollMousePoint = e.GetPosition(scrollviewer1); hOff = scrollviewer1.HorizontalOffset; } private void scrollviewer1_PreviewMouseLeftButtonUp(object sender,MouseButtonEventArgs e) { TimeSpan difference = DateTime.Now - mouseTimer; if (difference.TotalSeconds < 1) { btn3_Click(sender,e); } else return; } 所以现在,如果它是一个Click,它会打开,但你按住了点击,它只会滚动,dateTime的用法非常棒 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |