1

嗨,我正在尝试在 c# 后面的代码中使用模板项

我正在尝试访问 WindowsFormHost 的 PictureBox。然后将其设置为我想要的。

<Style x:Key="ScreenListBox" TargetType="{x:Type ToggleButton}">
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
        <Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
        <Setter Property="Padding" Value="2,0,0,0"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ToggleButton}">
                    <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="true" Margin="-0.001,0" Background="#FFABABAB" Width="120" Height="117">
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CommonStates">
                                <VisualState x:Name="Normal"/>
                                <VisualState x:Name="MouseOver"/>
                                <VisualState x:Name="Disabled">
                                    <Storyboard>
                                        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="stackPanel">
                                            <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
                                        </DoubleAnimationUsingKeyFrames>
                                        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="textBlock">
                                            <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
                                        </DoubleAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                            <VisualStateGroup x:Name="SelectionStates">
                                <VisualState x:Name="Unselected"/>
                                <VisualState x:Name="Selected"/>
                                <VisualState x:Name="SelectedUnfocused"/>
                            </VisualStateGroup>
                            <VisualStateGroup x:Name="ValidationStates">
                                <VisualState x:Name="Valid"/>
                                <VisualState x:Name="InvalidFocused"/>
                                <VisualState x:Name="InvalidUnfocused"/>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <StackPanel Orientation="Vertical" Name="TestStackPanel" d:LayoutOverrides="Height">
                            <Grid Margin="3" Height="85" Name="TestGrid" Background="White">
                                <WindowsFormsHost Name="wrapper" Margin="0,0,0,0" Background="{x:Null}">
                                    <Forms:PictureBox Name="Picture"></Forms:PictureBox>
                                </WindowsFormsHost>
                                <StackPanel x:Name="stackPanel" Margin="0" Width="Auto" Opacity="0">
                                    <DockPanel Margin="0" Width="Auto" Height="45">
                                        <Rectangle Fill="#FFD8D8D8" Margin="0" Width="16" HorizontalAlignment="Left"/>
                                        <Rectangle Fill="#FFEBE77A" Margin="0" Width="17" HorizontalAlignment="Left"/>
                                        <Rectangle Fill="#FF60CDE9" Margin="0" Width="16" HorizontalAlignment="Left"/>
                                        <Rectangle Fill="#FF60E98E" Margin="0" Width="16" HorizontalAlignment="Left"/>
                                        <Rectangle Fill="#FFC65F9C" Margin="0" Width="16" HorizontalAlignment="Left"/>
                                        <Rectangle Fill="#FFC43232" Margin="0" Width="17" HorizontalAlignment="Left"/>
                                        <Rectangle Fill="#FF0A37A5" Margin="0" Width="16" HorizontalAlignment="Left"/>
                                    </DockPanel>
                                    <DockPanel HorizontalAlignment="Stretch" Height="5" Width="Auto">
                                        <Rectangle Fill="#FF0A37A5" Margin="0" Width="16" HorizontalAlignment="Left" Height="Auto"/>
                                        <Rectangle Fill="Black" Margin="0" Width="16" HorizontalAlignment="Left" Height="Auto"/>
                                        <Rectangle Fill="#FFC65F9C" Margin="0" Width="17" HorizontalAlignment="Left" Height="Auto"/>
                                        <Rectangle Fill="Black" Margin="0" Width="16" HorizontalAlignment="Left" Height="Auto"/>
                                        <Rectangle Fill="#FF60CDE9" Margin="0" Width="16" HorizontalAlignment="Left" Height="Auto"/>
                                        <Rectangle Fill="Black" Margin="0" Width="16" HorizontalAlignment="Left" Height="Auto"/>
                                        <Rectangle Fill="#FFD8D8D8" Margin="0" Width="17" HorizontalAlignment="Left" Height="Auto"/>
                                    </DockPanel>
                                    <DockPanel HorizontalAlignment="Stretch" Height="15" VerticalAlignment="Bottom">
                                        <TextBlock x:Name="textBlock" TextWrapping="Wrap" Opacity="0" FontWeight="Bold" Width="60" TextAlignment="Center" FontSize="9.333"/>
                                    </DockPanel>

                                </StackPanel>

                            </Grid>
                            <Grid Margin="5,0" Height="20" VerticalAlignment="Bottom">
                                <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="Bottom" Margin="15,0" HorizontalAlignment="Center">
                                    <ContentPresenter.Resources>
                                        <Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource WrappingStyle}"/>
                                    </ContentPresenter.Resources>
                                </ContentPresenter>
                                <Button Content="Button" Margin="0" VerticalAlignment="Top" HorizontalAlignment="Right" Style="{DynamicResource Edit}"/>
                                <Path x:Name="path" Data="F1M29.2007,72.9482L25.9947,75.2372L25.9947,73.7922L18.5627,73.7922L18.5627,78.9302L25.9947,78.9302L25.9947,77.4862L29.2007,79.7752z" Fill="#FF231F20" Height="9.327" Stretch="Fill" Width="14.534" HorizontalAlignment="Left" Margin="0" VerticalAlignment="Top" Opacity="0"/>
                                <Rectangle x:Name="rectangle" Fill="#FF231F20" Margin="0" Width="20" Height="20" Opacity="0" VerticalAlignment="Top" d:LayoutOverrides="Width, Height, VerticalMargin" HorizontalAlignment="Left"/>
                            </Grid>
                        </StackPanel>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsChecked" Value="true">
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
                            <Setter Property="Opacity" TargetName="path" Value="1"/>
                            <Setter Property="Background" TargetName="Bd" Value="#FF26A1E5"/>
                        </Trigger>
                        <Trigger Property="Selector.IsSelected" Value="False"/>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

每当我在 C# 中使用这种风格时,我都会:

var listboxitem = new ToggleButton();

listboxitem.Style = (Style)FindResource("ScreenListBox");

VideoListBox.Items.Add(listboxitem);

//这里我希望能够使用ScreenListBox中的PictureBox。

将其传递给另一个函数。

我一直在尝试使用 Template.FindName,但没有成功。

任何人都可以看看并尝试将我带入正确的方向。

谢谢。

4

1 回答 1

3

嗨,我想实现这一点的唯一一种方法是创建一个自定义控件,您可以从 ToggleButton 继承该控件。您应该在某个地方为您的控件定义控件模板(如 generic.xaml 或 App.xaml)。在您的自定义控件中,您应该覆盖 OnApplyTemplate 方法,您可以在其中使用 FindName 方法至少访问 WindowsFormsHost(但也可能访问 PictureBox)。

您也可以尝试使用您的代码,在您尝试访问 PictureBox 之前 - 尝试调用 ApplyTemplate,也许这会强制 ToggleButton 加载所有内容并让您访问它的子项。

于 2013-04-03T23:13:24.177 回答