簡體   English   中英

如何在WPF Datagrid ColumnHeader中找到圖像,以便可以更改圖像?

[英]How do I find the image in a WPF Datagrid ColumnHeader so I can change the image?

我正在嘗試實現類似Excel的列過濾和排序。 為此,我使用了一個DataTemplate來定義列標題。

    <DataGrid x:Name="dataGrid" HorizontalAlignment="Stretch"  VerticalAlignment="Stretch" CanUserSortColumns="False">
        <DataGrid.Resources>
            <Style TargetType="{x:Type DataGridColumnHeader}">
                <Setter Property="ContentTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="23"/>
                                    <ColumnDefinition Width="*"/>
                                </Grid.ColumnDefinitions>
                                <Button x:Name="ExcelFilterButton" Tag="{Binding}" Click="ExcelFilterButton_Click" Margin="0,0,0,0" BorderThickness="0" Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}" Focusable="False" Grid.Column="0">
                                    <Image Source="Resources\NoSortNoFilter.png" Width="19" Height="19" />
                                </Button>
                                <TextBlock Text="{Binding}" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="1" />
                            </Grid>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </DataGrid.Resources>
    </DataGrid>

結果很好

我嘗試使用VisualTreeHelper從列標題中查找圖像,但是Header屬性是一個字符串。 我也嘗試過使用HeaderStyle和HeaderTemplate屬性,但無濟於事。

使用一個名為Snoop的WPF Spy程序,我可以在其中看到圖像 ,但是仍然不知道如何通過代碼訪問它。 我需要在代碼中訪問它的原因是根據該列是否已排序和/或過濾來更改圖像。 (這可以在XAML中完成嗎?)

好的,我想出了辦法。 這很可能不是正確的方法,但是我找到了一種可行的方法。

給您一些有關的過程。

  1. 用戶單擊標題按鈕。 按鈕的Tag屬性綁定到列標題。
  2. click事件處理程序將實例化上下文菜單,並將其Tag設置為等於按鈕Tag。
  3. 用戶單擊菜單項。
  4. 事件處理程序將“上下文菜單標簽”屬性和圖像名稱發送到先找到按鈕的例程,然后再找到按鈕中的圖像,然后更改圖像。

現在獲取代碼。

按鈕單擊事件處理程序:

    Private Sub ExcelFilterButton_Click(sender As Object, e As RoutedEventArgs)
        With DirectCast(Resources("sortContextMenu"), ContextMenu)
            .Tag = DirectCast(sender, Button).Tag
            .IsOpen = True
        End With
    End Sub

菜單項單擊事件處理程序

Private Sub ContextMenuItem_Click(Sender As Object, e As RoutedEventArgs)
    If TypeOf Sender Is MenuItem Then
        'just testing, of course this isn't all this handler does.
        SetColumnSortImage(Sender.Tag, "Filtered")
    End If
End Sub

SetColumnSortImage例程,該例程調用以下兩個例程。

Private Sub SetColumnSortImage(Tag As String, ImageName As String)
    Dim btn As Button = Nothing
    GetSortButton(Of Button)(dataGrid, Tag, btn)
    If btn IsNot Nothing Then
        Dim img As Image = GetChildOfType(Of Image)(btn)
        img.Source = New BitmapImage(New Uri("pack://application:,,,/Resources/" & ImageName & ".png"))
    End If
End Sub

GetSortButton例程

Private Sub GetSortButton(Of T As DependencyObject)(dep As DependencyObject, Tag As String, ByRef out As DependencyObject)
    If dep IsNot Nothing Then
        If TypeOf dep Is Button AndAlso CType(dep, Button).Tag = Tag Then
            out = dep
        Else
            If VisualTreeHelper.GetChildrenCount(dep) > 0 Then
                For i As Integer = 0 To VisualTreeHelper.GetChildrenCount(dep) - 1
                    GetSortButton(Of T)(VisualTreeHelper.GetChild(dep, i), Tag, out)
                Next
            End If
        End If
    End If
End Sub

該例程在C#中StackOverflow的其他位置找到。 我將其轉換為VB。

Private Function GetChildOfType(Of T As DependencyObject)(depObj As DependencyObject) As T
    If depObj Is Nothing Then
        Return Nothing
    End If

    For i As Integer = 0 To VisualTreeHelper.GetChildrenCount(depObj) - 1
        Dim child = VisualTreeHelper.GetChild(depObj, i)

        Dim result = If(TryCast(child, T), GetChildOfType(Of T)(child))
        If result IsNot Nothing Then
            Return result
        End If
    Next
    Return Nothing
End Function

您可能有更好的方法。 如果您這樣做,請發表。

暫無
暫無

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

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