Search code examples
c#xamlwinui-3winui

Add button in TokenizingTextBox


I would like to add a button in TokenizingTextBox thus when user clicks on it a DialogBox appears, or if it's not possible I would like to change behaviour of the standard Add button '+' so once user click on it DialogBox appears.

Does anybody know how to do it ?

Here is my XAML code

                <!--Add tokenized text box-->
<controls:TokenizingTextBox
    x:Name="TokenBox"   
    ItemsSource="{x:Bind  ViewModel.SelectedTokens  }"
    PlaceholderText="Add Locations"                  
    MaxHeight="104"
    HorizontalAlignment="Stretch"
    TextMemberPath="Text"
    TokenDelimiter=","
    MaximumTokens="3" 
    Grid.Row="1" Grid.Column="0"
    Text="{x:Bind ViewModel.StateMachineScanPath}">
    <controls:TokenizingTextBox.SuggestedItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <SymbolIcon Symbol="Accept"/>
                <TextBlock Text="{x:Bind Mode=TwoWay}" Padding="4,0,0,0"/>
            </StackPanel>
        </DataTemplate>
    </controls:TokenizingTextBox.SuggestedItemTemplate>
    <controls:TokenizingTextBox.QueryIcon >
        <SymbolIconSource Symbol="Add"/>                        
    </controls:TokenizingTextBox.QueryIcon>
</controls:TokenizingTextBox>

Appreciate your help in advance, Best regards, Maks.


Solution

  • As you can see in the Generic.xaml the button's name is "QueryButton". Using the `FindDescendants() extension method from the CommunityToolkit.WinUI.UI NuGet package, you can do something like this:

    private void MainPage_Loaded(object sender, Microsoft.UI.Xaml.RoutedEventArgs e)
    {
        if (this.TokenizingTextBoxControl
            .FindDescendants()
            .OfType<Button>()
            .Where(x => x.Name is "QueryButton")
            .FirstOrDefault() is not Button queryButton)
        {
            return;
        }
    
        queryButton.Click += QueryButton_Click;
    }
    
    private void QueryButton_Click(object sender, RoutedEventArgs e)
    {
        // Show your ContentDialog.
    }