<bdo id='Qlh2s'></bdo><ul id='Qlh2s'></ul>

      1. <tfoot id='Qlh2s'></tfoot>

      2. <small id='Qlh2s'></small><noframes id='Qlh2s'>

      3. <i id='Qlh2s'><tr id='Qlh2s'><dt id='Qlh2s'><q id='Qlh2s'><span id='Qlh2s'><b id='Qlh2s'><form id='Qlh2s'><ins id='Qlh2s'></ins><ul id='Qlh2s'></ul><sub id='Qlh2s'></sub></form><legend id='Qlh2s'></legend><bdo id='Qlh2s'><pre id='Qlh2s'><center id='Qlh2s'></center></pre></bdo></b><th id='Qlh2s'></th></span></q></dt></tr></i><div id='Qlh2s'><tfoot id='Qlh2s'></tfoot><dl id='Qlh2s'><fieldset id='Qlh2s'></fieldset></dl></div>
        <legend id='Qlh2s'><style id='Qlh2s'><dir id='Qlh2s'><q id='Qlh2s'></q></dir></style></legend>
      4. 用户选择子项后 TreeView 自动选择父项

        时间:2023-06-09
        1. <i id='pMfze'><tr id='pMfze'><dt id='pMfze'><q id='pMfze'><span id='pMfze'><b id='pMfze'><form id='pMfze'><ins id='pMfze'></ins><ul id='pMfze'></ul><sub id='pMfze'></sub></form><legend id='pMfze'></legend><bdo id='pMfze'><pre id='pMfze'><center id='pMfze'></center></pre></bdo></b><th id='pMfze'></th></span></q></dt></tr></i><div id='pMfze'><tfoot id='pMfze'></tfoot><dl id='pMfze'><fieldset id='pMfze'></fieldset></dl></div>

              <legend id='pMfze'><style id='pMfze'><dir id='pMfze'><q id='pMfze'></q></dir></style></legend>
                <bdo id='pMfze'></bdo><ul id='pMfze'></ul>
                <tfoot id='pMfze'></tfoot>

                <small id='pMfze'></small><noframes id='pMfze'>

                    <tbody id='pMfze'></tbody>

                • 本文介绍了用户选择子项后 TreeView 自动选择父项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  在我的窗口中,我有一个 TreeView 和 TextBox.假设 TextBox 用于编写自定义脚本,而 TreeView 是一种选择要插入的函数的方法;想想 Crystal Report 脚本编辑器.

                  In my window I have a TreeView and TextBox. Pretend the TextBox is used for writing a custom script and the TreeView is a way to select a function to insert; think Crystal Report script editor.

                  我的目标是让用户单击 TreeView 的其中一个子项,然后该子项插入到 TextBox 中.子节点是一个函数签名,位于父节点下.然后用户可以导航到文本框,选择一个函数参数并将其替换为另一个函数签名.为此,我处理了 TreeView 的 SelectedItemChanged 事件,设置了 TextBox 的 SelectedText,然后尝试在更改后突出显示文本.

                  My goal is for a user to click one of the children of the TreeView and that child inserts into the TextBox. The child is a function signature and resides under a Parent node. The user can then navigate to the TextBox, select one of the function parameters and replace it with another function signature. To accomplish this, I handle the TreeView's SelectedItemChanged event, set the TextBox's SelectedText, and then try to highlight the text after it's changed.

                  TextBox 的 SelectedText 已正确交换.但是,文本没有突出显示,滚动条也没有滚动到选定的文本.

                  The SelectedText of the TextBox is properly being swapped. However, the text is not being highlighted and the scrollbar isn't scrolling to the selected text.

                  这是我为重现该行为而编写的测试项目中的 XAML:

                    <Window x:Class="SelectedTextWeirdness.MainWindow"
                            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:System="clr-namespace:System;assembly=mscorlib"
                            xmlns:SelectedTextWeirdness="clr-namespace:SelectedTextWeirdness" Title="MainWindow" Width="600" Height="600"
                            x:Name="Me">
                       <Grid>
                          <Grid.RowDefinitions>
                             <RowDefinition Height="Auto" />
                             <RowDefinition Height="Auto" />
                          </Grid.RowDefinitions>
                          <TreeView Grid.Row="0" x:Name="treeView" ItemsSource="{Binding ElementName=Me, Path=TreeViewItems, Mode=TwoWay}" 
                                    SelectedItemChanged="treeView_SelectedItemChanged" Margin="10">
                             <TreeView.Resources>
                                <HierarchicalDataTemplate DataType="{x:Type SelectedTextWeirdness:Parent}" ItemsSource="{Binding Children}">
                                   <TextBlock Text="{Binding Name}" />
                                </HierarchicalDataTemplate>
                                <DataTemplate DataType="{x:Type SelectedTextWeirdness:Child}">
                                   <TextBlock Text="{Binding Name}" />
                                </DataTemplate>
                             </TreeView.Resources>
                          </TreeView>
                          <TextBox Grid.Row="1" x:Name="scriptTextBox" Margin="10" Height="200" Width="Auto" FontFamily="Consolas, Courier New" 
                                   HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Auto"
                                   MaxLines="9999" AcceptsReturn="True" AcceptsTab="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
                                   Text="{Binding Path=Script, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                   />
                       </Grid>
                    </Window>
                  

                  下面是代码隐藏:

                    using System;
                    using System.Collections.Generic;
                    using System.Linq;
                    using System.Text;
                    using System.Windows;
                    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 SelectedTextWeirdness
                    {
                       public class Child
                       {
                          public string Name
                          {
                             get;
                             set;
                          }
                       }
                  
                       public class Parent
                       {
                          public string Name
                          {
                             get;
                             set;
                          }
                  
                          public List<Child> Children
                          {
                             get;
                             set;
                          }   
                       }
                  
                       /// <summary>
                       /// Interaction logic for MainWindow.xaml
                       /// </summary>
                       public partial class MainWindow : Window
                       {
                          public List<Parent> TreeViewItems
                          {
                             get;
                             set;
                          }
                  
                          public MainWindow()
                          {
                             BuildTreeViewItems();
                  
                             InitializeComponent();
                          }
                  
                          private void BuildTreeViewItems()
                          {
                             TreeViewItems = new List<Parent>()
                                                {
                                                   new Parent()
                                                      {
                                                         Name = "Parent1",
                                                         Children =
                                                            new List<Child>()
                                                               {
                                                                  new Child() {Name = "ReallyLongFunctionNameNumber1(ReallyLongLeft1, ReallyLongRight1)"},
                                                                  new Child() {Name = "ReallyLongFunctionNameNumber2(ReallyLongLeft2, ReallyLongRight2)"},
                                                                  new Child() {Name = "ReallyLongFunctionNameNumber3(ReallyLongLeft3, ReallyLongRight3)"},
                                                                  new Child() {Name = "ReallyLongFunctionNameNumber4(ReallyLongLeft4, ReallyLongRight4)"},
                                                                  new Child() {Name = "ReallyLongFunctionNameNumber5(ReallyLongLeft5, ReallyLongRight5)"}
                                                               }
                                                      },
                                                   new Parent()
                                                      {
                                                         Name = "Parent2",
                                                         Children =
                                                            new List<Child>()
                                                               {
                                                                  new Child() {Name = "ReallyLongFunctionNameNumber1(ReallyLongLeft1, ReallyLongRight1)"},
                                                                  new Child() {Name = "ReallyLongFunctionNameNumber2(ReallyLongLeft2, ReallyLongRight2)"},
                                                                  new Child() {Name = "ReallyLongFunctionNameNumber3(ReallyLongLeft3, ReallyLongRight3)"},
                                                                  new Child() {Name = "ReallyLongFunctionNameNumber4(ReallyLongLeft4, ReallyLongRight4)"},
                                                                  new Child() {Name = "ReallyLongFunctionNameNumber5(ReallyLongLeft5, ReallyLongRight5)"}
                                                               }
                                                      }
                                                };
                          }
                  
                          private void treeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
                          {
                             var tree = (TreeView)sender;
                             var selectedItem = tree.SelectedItem as Child;
                             if (selectedItem != null)
                             {
                                int selectionStart = scriptTextBox.SelectionStart;
                                string selectedText = selectedItem.Name;
                                scriptTextBox.SelectedText = selectedText;
                                scriptTextBox.Focus();            
                                scriptTextBox.Select(selectionStart, selectedText.Length);
                             }
                          }
                       }
                    }
                  

                  我已尝试设置 SelectedItemChanged e.Handled = true.那没有用.我已经尝试处理 TextBox 的 LostFocus 并设置 e.Handled = true 并且没有奏效.这似乎只在我使用 HierarchicalDateTemplate 时发生.如果我将数据更改为仅一级,则此设置可以正常工作.

                  I have tried setting the SelectedItemChanged e.Handled = true. That didn't work. I've tried handling the LostFocus of the TextBox and setting e.Handled = true and that hasn't worked. This only seems to happen when I use the HierarchicalDateTemplate. If I change the data to be one level only, this setup works fine.

                  有什么想法吗?

                  推荐答案

                  核心问题是在事件处理程序中进行 Focus() 更改.通过在 BeginInvoke 中调用来推迟焦点.

                  The core issue is to have a Focus() change within an event handler. Postpone the Focus by calling it within a BeginInvoke.

                  类似:

                  delegate void voidDelegate();
                  
                  private void treeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
                  {
                      var tree = (TreeView)sender;
                      var selectedItem = tree.SelectedItem as Child;
                      if (selectedItem != null)
                      {
                          int selectionStart = scriptTextBox.SelectionStart;
                          string selectedText = selectedItem.Name;
                          voidDelegate giveFocusDelegate = new  voidDelegate(giveFocus);  
                          Dispatcher.BeginInvoke(giveFocusDelegate, new object[] { });
                          scriptTextBox.SelectedText = selectedText;         
                      }
                  }
                  
                  private void giveFocus()
                  {
                      scriptTextBox.Focus();
                  }    
                  

                  应该让你离目标更近.

                  我们怎么知道这会起作用?

                  Edit : How do we know this will work ?

                  作为 Dispatcher.BeginInvoke 的文档说:

                  As the documentation for Dispatcher.BeginInvoke says :

                  操作被添加到 Dispatcher 的事件队列中指定 DispatcherPriority.

                  The operation is added to the event queue of the Dispatcher at the specified DispatcherPriority.

                  因此,无论您调用 beginInvoke 的任务的优先级如何,调用发生的最近时间是在当前操作的执行结束之后:beginInvoked 操作被推送"到调度程序队列的某个位置,这是有效的在一个线程上.

                  So whatever the priority of the task where you call beginInvoke, the nearest time when the call can happen is right after the execution of current operation ended : the beginInvoked operation is 'pushed' somewhere on the queue of the dispatcher, which works on a single thread.

                  这篇关于用户选择子项后 TreeView 自动选择父项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  上一篇:TextBox 使用 GDI 还是 GDI+ 下一篇:如何在 C# 应用程序的文本框中执行 VBScript 命令?

                  相关文章

                    <tfoot id='v2q7y'></tfoot>

                      <bdo id='v2q7y'></bdo><ul id='v2q7y'></ul>
                    <legend id='v2q7y'><style id='v2q7y'><dir id='v2q7y'><q id='v2q7y'></q></dir></style></legend>

                    1. <i id='v2q7y'><tr id='v2q7y'><dt id='v2q7y'><q id='v2q7y'><span id='v2q7y'><b id='v2q7y'><form id='v2q7y'><ins id='v2q7y'></ins><ul id='v2q7y'></ul><sub id='v2q7y'></sub></form><legend id='v2q7y'></legend><bdo id='v2q7y'><pre id='v2q7y'><center id='v2q7y'></center></pre></bdo></b><th id='v2q7y'></th></span></q></dt></tr></i><div id='v2q7y'><tfoot id='v2q7y'></tfoot><dl id='v2q7y'><fieldset id='v2q7y'></fieldset></dl></div>
                    2. <small id='v2q7y'></small><noframes id='v2q7y'>