代码之家  ›  专栏  ›  技术社区  ›  Ashley Davis

如何让ListBox、Canvas和Thumb一起工作?

  •  1
  • Ashley Davis  · 技术社区  · 15 年前

    不幸的是,拇指似乎可以处理鼠标事件,因此单击拇指不会使项目处于选中状态。

    我希望这些元素可以一起工作,而不必求助于程序代码中的变通方法。如果有人知道这是否可能或如何做到,请告诉我。

    下面是代码示例。

    <Window x:Class="ListBoxCanvasThumb.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="300" Width="300"
        Loaded="Window_Loaded"
        >
        <Grid>
            <ListBox
                x:Name="listBox"
                >
                <ListBox.ItemsPanel>
                    <ItemsPanelTemplate>                
                        <Canvas />
                    </ItemsPanelTemplate>
                </ListBox.ItemsPanel>
            </ListBox>
        </Grid>
    </Window>
    

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        Thumb t = new Thumb();
        t.Width = 10;
        t.Height = 10;
        t.DragDelta += new DragDeltaEventHandler(thumb_DragDelta);
    
        ListBoxItem i = new ListBoxItem();
        Canvas.SetLeft(i, 10);
        Canvas.SetTop(i, 10);
        i.Content = t;
    
        listBox.Items.Add(i);
    }
    

    在DragDelta事件处理程序中,我更新项目在画布中的位置:

    void thumb_DragDelta(object sender, DragDeltaEventArgs e)
    {
        ListBoxItem i = (ListBoxItem)((Thumb)sender).Parent;
        Canvas.SetLeft(i, Canvas.GetLeft(i) + e.HorizontalChange);
        Canvas.SetTop(i, Canvas.GetTop(i) + e.VerticalChange);
    }
    
    3 回复  |  直到 15 年前
        1
  •  3
  •   Ray Burns    15 年前

    Thumb 控制并不是真的给你买那么多东西,它在几个方面与你想要做的事情相冲突。我会把它处理掉的。

    拇指 通过截取鼠标按下、鼠标移动和鼠标向上事件:

    • 在鼠标下键中,设置“拖动”标志,注意当前位置,然后捕获鼠标
    • 在鼠标移动中,如果“拖动”为真,则根据控件上鼠标位置与原始位置之间的差异更新Canvas.Left和Canvas.Top

    通过这样做 拇指 ListBox .

        2
  •  1
  •   Aviad P.    15 年前

    我不知道这是否能满足您不使用过程代码的要求,因为显然您已经这样做了(或者这只是一个复制示例?)

    无论如何,将处理程序添加到 ListBoxItem 对于 PreviewMouseDown

    i.PreviewMouseDown += new MouseButtonEventHandler(LBI_PreviewMouseDown);
    
    void LBI_PreviewMouseDown(object sender, MouseButtonEventArgs e)
    {
        var lbi = (ListBoxItem)sender;
        lbi.IsSelected = true;
        lbi.Focus();
    }
    
        3
  •  1
  •   John Bowen    15 年前

    您可以尝试将拇指移动到ListBoxItem模板中,并使用拇指的焦点状态触发选择。默认情况下,Thumb不可聚焦,但可以将其打开。

             <ListBox.ItemContainerStyle>
                <Style TargetType="{x:Type ListBoxItem}">
                    <Setter Property="Canvas.Left" Value="10" />
                    <Setter Property="Canvas.Top" Value="10" />
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type ListBoxItem}">
                                <Border x:Name="Bd" ...>
                                    <DockPanel>
                                        <Thumb x:Name="dragger" DockPanel.Dock="Top" 
                                               Width="50" Height="20" Focusable="True"/>
                                        <ContentPresenter/>
                                    </DockPanel>
                                </Border>
                                <ControlTemplate.Triggers>
                                    <Trigger SourceName="dragger" Property="IsFocused" Value="True">
                                        <Setter Property="IsSelected" Value="True" />
                                    </Trigger>
    

    ...