我正在使用TreeView控件,當它單擊其中一個時,它會自動滾動到左對齊TreeViewItem。我已經看了我的樣式和控制模板,但我沒有找到任何東西。有沒有一個默認的ControlTemplate導致這個?我想禁用它。用於滾動TreeView控件的WPF ControlTemplate
回答
由於ScrollViewer對它們調用BringIntoView(),因此項目會滾動。所以避免滾動的一種方法是禁止處理RequestBringIntoView事件。您可以快速地嘗試了這一點通過繼承TreeView和實例這種控制來代替:
public class NoScrollTreeView : TreeView
{
public class NoScrollTreeViewItem : TreeViewItem
{
public NoScrollTreeViewItem() : base()
{
this.RequestBringIntoView += delegate (object sender, RequestBringIntoViewEventArgs e) {
e.Handled = true;
};
}
protected override DependencyObject GetContainerForItemOverride()
{
return new NoScrollTreeViewItem();
}
}
protected override DependencyObject GetContainerForItemOverride()
{
return new NoScrollTreeViewItem();
}
}
它看起來像我找到了一個很好的線索上MSDN:
聽起來這是一個互動 與ScrollViewer中,並重點 系統。
當元件被聚焦的 的ScrollViewer內(這是 TreeView的模板的一部分),所述的ScrollViewer 被指示以使元件 可見。它自動響應 滾動到請求的元素。
處理這些重點要求的ScrollViewer 的內部方法 所有私人和/或內部,所以你 真的不能得到他們。我不認爲 這個案例太多,你可以在 中做;這只是焦點如何工作。
那麼,是嗎?當然還有一個辦法修改TreeView的模板,使ScrollViewer中不會有這種行爲......
好吧,我終於能夠得到這樣的默認樣式:
using (Stream sw = File.Open(@"C:\TreeViewDefaults.xaml", FileMode.Truncate, FileAccess.Write))
{
Style ts = Application.Current.FindResource(typeof(TreeView)) as Style;
if (ts != null)
XamlWriter.Save(ts, sw);
}
它生產:
<Style TargetType="TreeView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:s="clr-namespace:System;assembly=mscorlib"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style.Triggers>
<Trigger Property="VirtualizingStackPanel.IsVirtualizing">
<Setter Property="ItemsControl.ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate><VirtualizingStackPanel IsItemsHost="True" /></ItemsPanelTemplate>
</Setter.Value>
</Setter>
<Trigger.Value>
<s:Boolean>True</s:Boolean>
</Trigger.Value>
</Trigger>
</Style.Triggers>
<Style.Resources>
<ResourceDictionary />
</Style.Resources>
<Setter Property="Panel.Background">
<Setter.Value><DynamicResource ResourceKey="{x:Static SystemColors.WindowBrushKey}" /></Setter.Value>
</Setter>
<Setter Property="Border.BorderBrush">
<Setter.Value><SolidColorBrush>#FF828790</SolidColorBrush></Setter.Value>
</Setter>
<Setter Property="Border.BorderThickness">
<Setter.Value><Thickness>1,1,1,1</Thickness></Setter.Value>
</Setter>
<Setter Property="Control.Padding">
<Setter.Value><Thickness>1,1,1,1</Thickness></Setter.Value>
</Setter>
<Setter Property="TextElement.Foreground">
<Setter.Value><DynamicResource ResourceKey="{x:Static SystemColors.ControlTextBrushKey}" /></Setter.Value>
</Setter>
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility">
<Setter.Value><x:Static Member="ScrollBarVisibility.Auto" /></Setter.Value>
</Setter>
<Setter Property="ScrollViewer.VerticalScrollBarVisibility">
<Setter.Value><x:Static Member="ScrollBarVisibility.Auto" /></Setter.Value>
</Setter>
<Setter Property="Control.VerticalContentAlignment">
<Setter.Value><x:Static Member="VerticalAlignment.Center" /></Setter.Value>
</Setter>
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate TargetType="TreeView">
<Border BorderThickness="{TemplateBinding Border.BorderThickness}"
BorderBrush="{TemplateBinding Border.BorderBrush}"
Name="Bd" SnapsToDevicePixels="True">
<ScrollViewer CanContentScroll="False"
HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}"
VerticalScrollBarVisibility="{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}"
Background="{TemplateBinding Panel.Background}"
Padding="{TemplateBinding Control.Padding}"
Name="_tv_scrollviewer_"
SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}"
Focusable="False">
<ItemsPresenter />
</ScrollViewer>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="UIElement.IsEnabled">
<Setter Property="Panel.Background" TargetName="Bd">
<Setter.Value>
<DynamicResource ResourceKey="{x:Static SystemColors.ControlBrushKey}" />
</Setter.Value>
</Setter>
<Trigger.Value>
<s:Boolean>False</s:Boolean>
</Trigger.Value>
</Trigger>
<Trigger Property="VirtualizingStackPanel.IsVirtualizing">
<Setter Property="ScrollViewer.CanContentScroll" TargetName="_tv_scrollviewer_">
<Setter.Value><s:Boolean>True</s:Boolean></Setter.Value>
</Setter>
<Trigger.Value>
<s:Boolean>True</s:Boolean>
</Trigger.Value>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
不幸的是,這看起來沒有什麼幫助。我沒有看到有關停止自動滾動焦點的任何內容。
還在尋找......
另一個有趣的花絮:有一個叫HandlesScrolling一個重寫的布爾值,總是返回true。在反編譯源代碼之後,它看起來像這個屬性從來沒有使用過(或者它在XAML中的一些深色,黑暗,祕密的地方使用)。我試圖讓自己的TreeView控件將此值設置爲false,但它不起作用。
在這個問題上花了一些時間後,我發現我工作的解決方案。
brians解決方案,以防止冒泡的TreeViewItem上的RequestBringIntoView事件是第一步。不幸的是,這也將停止,如果你通過
yourtreeview.SelectedItem = yourtreeviewitem
所以編程方式更改所選項目要顯示一個樹型視圖,對我來說,解決辦法如下修改樹視圖的控件模板:
<Style x:Key="{x:Type TreeView}" TargetType="TreeView">
<Setter Property="OverridesDefaultStyle" Value="True" />
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TreeView">
<Border Name="Border" BorderThickness="0" Padding="0" Margin="1">
<ScrollViewer Focusable="False" CanContentScroll="False" Padding="0">
<Components:AutoScrollPreventer Margin="0">
<ItemsPresenter/>
</Components:AutoScrollPreventer>
</ScrollViewer>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
的「 autoscrollpreventer」是:
using System;
using System.Windows;
using System.Windows.Controls;
namespace LiveContext.Designer.GUI.Components {
public class AutoScrollPreventer : StackPanel
{
public AutoScrollPreventer() {
this.RequestBringIntoView += delegate(object sender, RequestBringIntoViewEventArgs e)
{
// stop this event from bubbling so that a scrollviewer doesn't try to BringIntoView..
e.Handled = true;
};
}
}
}
希望我t幫助..
非常好的解決方案。 – stijn 2012-01-17 20:31:44
- 1. 爲WPF Treeview啓用滾動
- 2. TreeView控件在WPF
- 3. TreeView控件與WPF
- 4. 如何在wpf表單上顯示可滾動的treeview控件
- 5. WPF我用於Validation.ErrorTemplate的ControlTemplate無法訪問父控件
- 6. 優化WPF 4.0 TreeView滾動性能
- 7. WPF:使ControlTemplate中的控件失效
- 8. 將TreeView控件滾動到頂部
- 9. 第三方WPF Treeview控件
- 10. WPF MVVM TreeView控件組
- 11. 在WPF虛擬化Treeview滾動錯誤
- 12. TreeView的第二級ControlTemplate
- 13. WPF - ControlTemplate上的事件?
- 14. TreeView控件類似於utorrent的控件
- 15. WPF動畫在ControlTemplate中完成事件
- 16. 當使用鼠標滾輪滾動時WPF TreeView出現奇怪的問題
- 17. WPF ControlTemplate觸發動畫
- 18. 如何從WPF中的樣式ControlTemplate引用父控件?
- 19. WPF ControlTemplate AND DataTemplate
- 20. WPF ControlTemplate和Binding
- 21. WPF TabControl ControlTemplate
- 22. WPF ControlTemplate與foreach?
- 23. WPF的ControlTemplate身高
- 24. WPF瀏覽器控件滾動位置
- 25. WPF:如何滾動ListView控件水平?
- 26. WPF滾動查看器概述控件
- 27. WPF ListBox控件水平滾動代碼
- 28. TreeView的跳動滾動
- 29. 選擇在TreeView控件WPF項目
- 30. WPF問題與TreeView和彈出控件
不錯。我想我們可以去涉及.NET資源,但是......你知道的。 – 2008-10-30 12:06:54