1

私はPortItemから派生したContentControlTextedStackPanelから派生した を持ってStackPanelいますPortItems。そして、MainWindow私にはStackPanelsを含む2つがありますTextedStackPanelsPortItem私は MouseLeftButtonDownメソッドをオーバーライドしました。しかし、このメソッドでこれを行うと、起動されません。フォーラムでここを検索したところ、 のBackgroundプロパティGrid/StackPanelを透明に設定する必要があることがわかりました。これを適用しましたが、変更はありません。何をすべきか ?

編集 1 部分クラスを使用します。私は2つのクラスを持っています:PortItem.csPortItem.cs.xaml. この XAML ファイルの視覚的な変更を修正します。

EDIT 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コントロールがマウスの右クリックイベントを取得します。上に何もないことを確認するには、TextedStackPanelに最後に追加されたものとしてPortItemを置くことを宣言します。他に何も表示されていないことを再確認するには、他のコントロールの背景色を(テストのためだけに)本当に目立つ色に変更して、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行に複製するために、followクラスを作成しました。メソッドが実行されない理由は、マウスが実際に操作するための視覚要素がないためだと思います。スタイルを追加してみてください。以下のアプリを使用すると、メソッドが正しく起動するはずです。

   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 に答える