4

パス コンテンツを含むボタンがパス上でのマウス クリックのみを検出するという問題が発生しています。ux の場合、ボタンのどこかにクリックを登録したいと思います。ボタンの背景を null と透明の両方に設定して、上部のコントロール コンテナーが背景のスタイルを決定するようにしました。

ここに別のSO投稿があります:透明な背景のマウスイベント

述べたように、私はこれまで透明とヌルの両方を試しました。

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:wpfMyCustomControl">

<ControlTemplate x:Key="IconTemplate" TargetType="{x:Type ContentControl}">
    <Grid>
        <Path Name="ForegroundSymbol" Data="M0,0 L1,0 1,1 0,1 0.5,0.5 z" Fill="{TemplateBinding Foreground}" Stretch="Fill" />
    </Grid>
</ControlTemplate>

<Style x:Key="IconButtonStyle" TargetType="{x:Type RepeatButton}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type RepeatButton}">
                <Grid>
                    <ContentControl Name="icon" Template="{StaticResource IconTemplate}" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>


<ControlTemplate x:Key="MyCustomTemplate" TargetType="{x:Type local:MyCustomControl}">
    <Grid Name="LayoutRoot" Background="Red">
        <RepeatButton Background="{x:Null}" Style="{StaticResource ResourceKey=IconButtonStyle}" />
    </Grid>
</ControlTemplate>

<Style TargetType="{x:Type local:MyCustomControl}">
    <Setter Property="Template" Value="{StaticResource ResourceKey=MyCustomTemplate}" />
</Style>
</ResourceDictionary>

「Style」から「x:Key」属性を削除すると、コントロールがレンダリングされます。ボタンの「背景」部分でヒット検出がトリガーされない、上記の xaml コントロール スタイルで問題を再現できました。

4

3 に答える 3

6

透明な背景を使用する代わりに、ほぼ透明な背景を使用する必要があります 。このように、Click-event は引き続き発生しますが、ボタンは透明に見えます。
何かのようなもの:

<RepeatButton Background="#01FFFFFF" Style="{StaticResource ResourceKey=IconButtonStyle}" />

色定義の最初の 2 桁は、TransparencyまたはAlpha値を定義します。

于 2013-03-04T13:19:10.557 に答える
1

実際に使用している場合、Background が透明であれば HitTesting は機能します。スタイルを適用していますが、スタイルが含まれていないため、言えませんが、そのスタイルでテンプレートを設定していて、ControlTemplate で背景を使用していない場合、背景を設定しても意味がありません。通常、テンプレートのルート要素の Background は、Background (通常はパネルまたは境界線) に対して TemplateBinding を実行します。要素自体は Background を使用しません。もう 1 つのオプションは、HitTestCore メソッドをオーバーライドすることです。Reflector/ILSpy で TextBlock の実装を調べることができます。これは、(テキストの文字だけでなく) 四角形内の任意のポイントが有効なヒット ポイントであることを確認するためにこれをオーバーライドするためです。

編集:あなたが提供したスタイル/テンプレートに基づいて、問題は私が説明したものです。ControlTemplate内でBackgroundを使用する必要があります。そうしないと、影響はありません。したがって、IconTemplateは次のようになります。

<ControlTemplate x:Key="IconTemplate" TargetType="{x:Type ContentControl}">
    <Grid Background="{TemplateBinding Background}">
        <Path Name="ForegroundSymbol" Data="M0,0 L1,0 1,1 0,1 0.5,0.5 z" Fill="{TemplateBinding Foreground}" Stretch="Fill" />
    </Grid>
</ControlTemplate>
于 2013-03-02T03:46:17.087 に答える
0

透明に設定するよりも色を設定したくない場合は、ヒット検出の背景色を指定する必要があります。

于 2013-03-04T12:59:12.240 に答える