سؤال

<ItemsControl Name="CanvasTableMap" ItemsSource="{Binding}" ItemsPanel="{DynamicResource ItemsPanelTemplate1}" ItemTemplate="{DynamicResource DataTemplate1}">
    <ItemsControl.Resources>
        <ItemsPanelTemplate x:Key="ItemsPanelTemplate1">
            <WrapPanel   Background="{DynamicResource ContentBackground}" />        
        </ItemsPanelTemplate>
        <DataTemplate x:Key="DataTemplate1">
            <Button Canvas.Left="100"  Content="{Binding Name}" Template="{DynamicResource ButtonTableTemplate}"></Button>
        </DataTemplate>
    </ItemsControl.Resources>       
</ItemsControl>

Here is my code.No problem with that. I have created an adorner and i would like to add an adorner for each button when i want. It is a little difficult as i dont know how to get the Buttons. CanvasTableMap.Items returns the Model so i dont know how to get access to the controls efficiently.

هل كانت مفيدة؟

المحلول

An easy way to do that is to define a handler for the Loaded event of the button, and add the adorner in that handler:

XAML

<Button Canvas.Left="100"  Content="{Binding Name}" ... Loaded="Button_Loaded" />

Code-behind

private void Button_Loaded(object sender, RoutedEventArgs e)
{
    var button = (Button)sender;
    var layer = AdornerLayer.GetAdornerLayer(button);

    // Add the adorner
    ...
}

If you don't want to use code-behind, you can create an attached behavior (either with System.Windows.Interactivity or by creating an attached property)

نصائح أخرى

You can use the ItemContainerGenerator to get the control created from the data (ContainerFromItem). Usually doing things that way is not such a good idea though.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top