簡體   English   中英

使用控件樣式,如何基於 ToggleButton.IsChecked 綁定或觸發對 ToolTip 內容的更改?

[英]Using a control style, how can you bind or trigger a change to ToolTip contents based on ToggleButton.IsChecked?

我定義了一個共享的ToggleButton樣式,當IsCheckedtrue時顯示一個圖像,而當IsCheckedfalse時顯示另一個圖像。 IsChecked綁定到 ViewModel 上的 boolean 屬性可以很好地顯示所需的圖像,因此我知道正在應用我的樣式並且綁定到IsCheckedDataTrigger可以正常工作。

我想在IsChecked更改時更改ToolTip文本,但我在讓它工作時遇到了很多麻煩。 理想情況下,我希望ToolTip在未選中時顯示“打開”之類的內容,在選中時顯示“關閉”之類的內容。

問題是ToolTip沒有連接到可視化樹中的ToggleButton ,所以我需要另一種方法來找到ToggleButton.IsChecked 我正在嘗試完全以一種風格來執行此操作,因為我周圍散布着相當多的這些按鈕,因此不允許對 VM 進行任何更改。

理想情況下,該解決方案將允許我使用ToggleButton.Tag來存儲文本,並應用ConverterStringFormat (或ContentStringFormat )。 我已經覆蓋了ContentTemplate並將其替換為准系統ContentPresenter以擺脫典型的ToggleButton效果,因此可以根據需要進一步更改它。 (也許我已經刪除了一些重要的東西讓它起作用?idk。)

這是我的風格,可以改變圖像,但ToolTip永遠不會改變。

<!--Toggle button where content is a switch image that's "On" when checked and "Off" when anything else-->
<Style TargetType="ToggleButton" x:Key="OnOffToggleButton" x:Shared="False">
    <!-- this worked to format the initial tooltip contents, but no way to bind.
    <Style.Resources> 
        <Style TargetType="ToolTip">
            <Setter Property="ContentStringFormat" Value="Turn on {0}"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding ???}" Value="True">
                    <Setter Property="ContentStringFormat" Value="Turn off {0}"/>
                </DataTrigger> 
            </Style.Triggers>
        </Style>
    </Style.Resources> -->
    <Setter Property="Content" Value="{StaticResource ToggleOffImage}"/>
    <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ToggleButton">
                <ContentPresenter>
                    <ContentPresenter.ToolTip>
                        <TextBlock>
                            <TextBlock.Style>
                                <Style TargetType="TextBlock">
                                    <!-- this works -->
                                    <Setter Property="Text" Value="{Binding Tag, RelativeSource={RelativeSource Self}, StringFormat=Turn on {0}}"/>
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding IsChecked}" Value="True">
                                            <!-- trigger has no effect -->
                                            <Setter Property="Text" Value="{Binding Tag, RelativeSource={RelativeSource Self}, StringFormat=Turn off {0}}"/>
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </TextBlock.Style>
                        </TextBlock>
                    </ContentPresenter.ToolTip>
                </ContentPresenter>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsChecked, RelativeSource={RelativeSource Self}}" Value="True">
            <Setter Property="Content" Value="{StaticResource ToggleOnImage}"/>
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="ToolTip">
                <Setter.Value>
                    <!-- another thing that does not work -->
                    <TextBlock Text="{Binding Tag, RelativeSource={RelativeSource Self}, StringFormat=Turn off {0}}" />
                </Setter.Value>
            </Setter>
        </DataTrigger>
    </Style.Triggers>
</Style>

按鈕本身的定義類似於:

<ToggleButton Style="{StaticResource OnOffToggleButton}" 
              IsChecked="{Binding IsPoweredOn, Mode=OneWay}" 
              Command="{Binding TogglePowerCommand}" 
              Tag="Device Power"/>

StringFormat不適用於ToolTip ,因為它可以包含object類型的任意內容,而不僅僅是純文本。 但是, ToolTip公開了一個您可以使用的屬性ContentStringFormat

獲取或設置一個復合string ,該字符串指定在Content屬性顯示為string如何設置其格式。

由於ToolTip托管在單獨的彈出窗口 window 中,因此它與ToggleButton不屬於同一可視化樹,但您可以使用ToolTipPlacementTarget引用它。

獲取或設置ToolTip打開時相對於其定位的UIElement

<Style TargetType="ToggleButton" x:Key="OnOffToggleButton" x:Shared="False">
   <Setter Property="Content" Value="{StaticResource ToggleOffImage}"/>
   <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
   <Setter Property="ToolTip">
      <Setter.Value>
         <ToolTip Content="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}"
                  ContentStringFormat="Turn on {0}">
         </ToolTip>
      </Setter.Value>
   </Setter>
   <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ToggleButton">
                <ContentPresenter/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
   <Style.Triggers>
        <DataTrigger Binding="{Binding IsChecked, RelativeSource={RelativeSource Self}}" Value="True">
            <Setter Property="Content" Value="{StaticResource ToggleOnImage}"/>
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="ToolTip">
               <Setter.Value>
                  <ToolTip Content="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}"
                           ContentStringFormat="Turn off {0}">
                  </ToolTip>
               </Setter.Value>
            </Setter>
        </DataTrigger>
    </Style.Triggers>
</Style>

轉換器仍然可以像往常一樣應用於Content綁定。

<ToolTip Content="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}, Converter={StaticResource YourConverter}}"
         ContentStringFormat="Turn on {0}">

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM