2008-10-28 14 views
5

मैं ट्री व्यू कंट्रोल का उपयोग कर रहा हूं और यह स्वचालित रूप से बाएं-एलाइन ट्री व्यूइटम पर स्क्रॉल करता है जब उनमें से एक क्लिक किया जाता है। मैं अपने स्टाइल और कंट्रोल टेम्पलेट्स देख रहा हूं, लेकिन मुझे कुछ भी नहीं मिला है। क्या कोई डिफ़ॉल्ट नियंत्रण टेम्पलेट है जो इसका कारण बनता है? मैं इसे अक्षम करना चाहता हूं।स्क्रॉलिंग के लिए डब्ल्यूपीएफ कंट्रोल टेम्पलेट ट्री व्यू कंट्रोल

उत्तर

7

आइटम स्क्रॉल करें क्योंकि स्क्रॉलव्यूयर उन पर BringIntoView() को कॉल करता है। इसलिए स्क्रॉलिंग से बचने का एक तरीका है RequestBringIntoView ईवेंट के हैंडलिंग को दबाने के लिए। आप जल्दी से कि बाहर की कोशिश कर सकते बजाय TreeView उपवर्गीकरण और इस पर नियंत्रण instantiating द्वारा:

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(); 
    } 
} 
0

ऐसा लगता है कि मैं MSDN पर एक अच्छा सुराग नहीं मिला:

ऐसा लगता है कि इस ScrollViewer और ध्यान प्रणाली के साथ एक बातचीत है।

जब एक तत्व (जो TreeView टेम्पलेट का हिस्सा है) एक ScrollViewer के भीतर केंद्रित है, ScrollViewer तत्व दृश्यमान बनाने के लिए निर्देश दिए है। यह अनुरोधित तत्व पर स्क्रॉलिंग द्वारा स्वचालित रूप से प्रतिसाद देता है।

ScrollViewer के अंदर तरीकों कि इन फोकस अनुरोधों को हैंडल सभी निजी और/या आंतरिक ताकि आप वास्तव में उन्हें नहीं मिल सकता है। मैं नहीं सोचता कि में आप इस मामले में बहुत कुछ कर सकते हैं; यह सिर्फ फोकस कैसे काम करता है।

तो, क्या यह है? निश्चित रूप से वहाँ इतना है कि ScrollViewer इस व्यवहार के लिए नहीं होगा TreeView टेम्पलेट को संशोधित करने के लिए एक तरह से ...

0

ठीक है, मैं अंत में इस तरह डिफ़ॉल्ट शैली प्राप्त करने में सक्षम था:

 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> 

दुर्भाग्य से, उपयोगी नहीं दिखता है। ऑटो-स्क्रॉल-फ़ोकस चीज़ को रोकने के लिए मुझे वहां कोई भी गुण दिखाई नहीं देता है।

फिर भी देख ...

0

एक और मजेदार मुलायम भोजन: वहाँ एक overridable बूलियन मान कि हमेशा सच रिटर्न HandlesScrolling कहा जाता है। स्रोत को अपनाने के बाद, ऐसा लगता है कि इस संपत्ति का कभी भी उपयोग नहीं किया जाता है (या इसका उपयोग XAML में कुछ गहरे, अंधेरे, गुप्त स्थान में किया जा रहा है)। मैंने इस मूल्य को झूठी पर सेट करने के लिए अपना खुद का वृक्ष दृश्य नियंत्रण करने की कोशिश की और यह काम नहीं किया।

+0

अच्छा। मुझे लगता है कि हम .NET स्रोतों में wading जा सकते हैं, लेकिन ... आप जानते हैं। –

6

इस समस्या के बारे में कुछ घंटे बिताने के बाद मैं एक समाधान है कि मेरे लिए काम करता पाया।

ब्रीबिंग से TreeBiewItem पर RequestBringIntoView ईवेंट को रोकने के लिए ब्रायन समाधान पहला कदम था।दुर्भाग्य से यह भी बंद हो जाता है अगर आप

yourtreeview.SelectedItem = yourtreeviewitem 
तो

द्वारा प्रोग्राम के रूप में चुने गए आइटम को बदलने एक treeviewitem दिखाया जा सकता है, मेरे लिए समाधान के रूप में इस treeview की ControlTemplate संशोधित करने के लिए है:

<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; 
     }; 

    } 
} 

}

आशा मैं टी मदद करता है ..

+0

बहुत अच्छा समाधान। – stijn

संबंधित मुद्दे