Ill*_*dan 13 wpf scrollviewer controltemplate
考虑第一版代码(MainWindow.xaml):
<ScrollViewer>
<local:CustomControl1 Width="1000" Height="1000" Background="Red"/>
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)
其中CustomControl1派生自ItemsControl.在CustomControl1中,我重写了OnMouseDown事件.这段代码完美无缺,我确实抓住了鼠标按下事件.
现在第二版代码(MainWindow.xaml):
<local:CustomControl1 Width="1000" Height="1000" Background="Red"/>
Run Code Online (Sandbox Code Playgroud)
在Generic.xaml里面,我更改了我的项目控件的模板:
<ControlTemplate TargetType="{x:Type local:CustomControl1}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<ScrollViewer
VerticalScrollBarVisibility="Visible"
HorizontalScrollBarVisibility="Visible"
>
<ItemsPresenter/>
</ScrollViewer>
</Border>
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)
当我将scrollviewer作为控件模板的一部分时,我不再接收OnMouseDownEvent(左键单击).出于某种原因,现在将鼠标按下事件标记为已处理.如果不是重写OnMouseDown,我在items控件构造函数中使用以下语句,则捕获事件:
AddHandler(Mouse.MouseDownEvent, new MouseButtonEventHandler(OnMouseDown), true);
Run Code Online (Sandbox Code Playgroud)
首先,我想了解为什么将scrollviewer放在模板中改变鼠标的行为.第二,有没有人知道一些解决方法?我提出的解决方案(通过捕获处理事件)对我来说是不可接受的.在我的应用程序中,只有当没有任何项控制子项处理它时,我才需要处理鼠标按下事件.
提前致谢.
Fre*_*lad 23
如果你看一下默认Template的ListBox,例如(也是从派生ItemsControl),你会看到,ScrollViewer已经Focusable="False"在模板中设置.这允许鼠标事件传递给您的控件
<ScrollViewer VerticalScrollBarVisibility="Visible"
HorizontalScrollBarVisibility="Visible"
Focusable="False" >
<ItemsPresenter/>
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3035 次 |
| 最近记录: |