1

我有PortItem哪个衍生自ContentControlTextedStackPanel衍生自StackPanel哪个包含PortItems。在MainWindow我有 2 个StackPanels包含TextedStackPanels. 在PortItem我有覆盖的 MouseLeftButtonDown方法。但是当我在这个方法上这样做时不会被解雇。我在论坛里搜索了这里,发现必须将Background属性Grid/StackPanel设置为透明。我应用了这个,但没有任何变化。该怎么办 ?

编辑 1 我使用部分类。我有 2 个课程:PortItem.csPortItem.cs.xaml. 我修改此 XAML 文件中的任何视觉更改。

编辑 2 也不会触发任何鼠标事件。当我保持鼠标打开时,我使用 IsMouseOver 的触发器也不起作用PortItem

XAML

<ContentControl x:Class="**.PortItem"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     xmlns:UI="clr-namespace:**.UIData" Width="17" Height="17" Margin="3" SnapsToDevicePixels="True" >
<Grid Background="Transparent" Name="mainGrid">
    <!-- transparent extra space makes connector easier to hit -->
    <Rectangle Fill="Transparent" Margin="-2"/>
    <Border BorderBrush="Green" x:Name="border" BorderThickness="2">
        <Border.Style>
            <Style>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Grid}, Path=IsMouseOver}" Value="True">
                        <Setter  Property="Border.BorderBrush" Value="Blue"/>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding IsSelected}" Value="True">
                        <Setter  Property="Border.BorderBrush" Value="Blue"/>
                    </DataTrigger>
                    <!--<DataTrigger Binding="{Binding ContactPort}" Value="{x:Null}">
            <Setter TargetName="border" Property="Border.BorderBrush" Value="Green"/>
        </DataTrigger>-->
                </Style.Triggers>
            </Style>
        </Border.Style>
            <Image  Source="/**;component/Resources/1337238611_port.png">
        </Image>
    </Border>
</Grid>

4

2 回答 2

0

确保您没有在 PortItem 上将“IsHitTestVisible”设置为 false。此外,请确保没有其他控件位于其之上。如果是,请将它们的“IsHitTestVisible”属性设置为 false,然后您的 PortItem 控件将获得鼠标右键单击事件。为确保没有任何内容位于顶部,请将您的 PortItem 声明为添加到 TextedStackPanel 的最后一件事。要仔细检查顶部是否没有其他内容,请将其他控件的背景颜色更改为非常明显的颜色(仅用于测试),以查看是否有任何东西覆盖了您的 PortItem 控件。此外,更改 PortItem 控件上的颜色以验证它是否确实在您认为的位置。然后,一旦一切正常,将颜色改回原来的颜色。

如果您可以向我们提供您的 XAML 的代码示例,那可能会有所帮助。如果您在后面的代码中动态添加 PortItem,请也提供该代码。

于 2012-06-12T13:47:02.060 回答
0

编辑:根据您对代码所做的更改,尝试将 ClipToBounds="False" 添加到用户控件声明的顶部。

<ContentControl x:Class="**.PortItem" ClipToBounds="False"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     xmlns:UI="clr-namespace:**.UIData" Width="17" Height="17" Margin="3" SnapsToDevicePixels="True" >

您是否为 PortItem 创建了模板?我创建了跟随类来复制您的 PortItem 和 base.OnMouseButtonDown 行上的断点并触发它,我认为您的方法未执行的原因是因为鼠标没有实际交互的视觉元素,请尝试添加样式在您的应用程序下方,您应该会看到该方法正确触发。

   public class PortItem: ContentControl
    {
        protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
        {

            base.OnMouseLeftButtonDown(e);
        }
    }

然后在 XAML 中我创建了一个样式来给它一些渲染的东西。

 <local:PortItem Margin="44,36,156,95">
        <local:PortItem.Style>
            <Style TargetType="{x:Type local:PortItem}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type local:PortItem}">
                            <Border Background="Transparent">
                                <ContentPresenter Content="{TemplateBinding Content}"/>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </local:PortItem.Style>
    </local:PortItem>

您提到的背景是透明的,您可以在边框控件中看到,如果您将背景排除在外,您是正确的,该事件永远不会触发。

于 2012-06-12T13:43:45.700 回答