Domanda

Ho usato XamlPadX per copiare il default di ComboBox e l'ho incollato nelle risorse della mia app.

Ora dopo non posso più aprire la casella combinata. Se faccio clic sul pulsante a discesa, non succede nulla.

Un'altra cosa mi sta infastidendo. Anche se l'app viene compilata ed eseguita, il designer mi mostra un errore:

  

" Il valore 'Control.Template' non può essere assegnato alla proprietà 'Proprietà'. Il tipo "IFrameworkInputElement" non ha un DependencyObjectType corrispondente. & Quot ;.

sulla seguente riga:

<ComboBox Name="modifier" SelectedIndex="0" Style="{DynamicResource MyComboStyle}">
       <ComboBoxItem>1</ComboBoxItem>
       <ComboBoxItem>2</ComboBoxItem>
       <ComboBoxItem>3</ComboBoxItem>
</ComboBox>

Per questo motivo il designer non mi mostra il controllo, ma si presenta correttamente quando l'app viene eseguita.

Ma quando dichiaro il ComboBox come controllo proprio non c'è nessun errore di progettazione:

<ComboBox x:Class="ModifierControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    
    Style="{DynamicResource MyComboStyle}" >
</ComboBox>

Quindi non viene mostrato alcun errore di progettazione.

È stato utile?

Soluzione

Ecco il modello per ComboBox scelto direttamente da Blend. Fammi sapere se funziona.

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Classic"
    x:Class="MyComboBoxStyle.MainWindow"
    x:Name="Window"
    Title="MainWindow"
    Width="640" Height="480">

    <Window.Resources>
        <Style x:Key="MyComboBoxStyle" TargetType="{x:Type ComboBox}">
            <Setter Property="FocusVisualStyle">
                <Setter.Value>
                    <Style>
                        <Setter Property="Control.Template">
                            <Setter.Value>
                                <ControlTemplate>
                                    <Rectangle Stroke="Black" StrokeDashArray="1 2" StrokeThickness="1" Margin="4,4,21,4" SnapsToDevicePixels="True"/>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </Setter.Value>
            </Setter>
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}"/>
            <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
            <Setter Property="Margin" Value="0"/>
            <Setter Property="Padding" Value="2,1"/>
            <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
            <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
            <Setter Property="ScrollViewer.CanContentScroll" Value="True"/>
            <Setter Property="VerticalContentAlignment" Value="Center"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ComboBox}">
                        <Border SnapsToDevicePixels="True" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
                            <Grid>
                                <Microsoft_Windows_Themes:ClassicBorderDecorator x:Name="Border" Background="{TemplateBinding Background}" BorderStyle="Sunken" BorderThickness="2">
                                    <Microsoft_Windows_Themes:ClassicBorderDecorator.BorderBrush>
                                        <SolidColorBrush/>
                                    </Microsoft_Windows_Themes:ClassicBorderDecorator.BorderBrush>
                                    <Popup x:Name="PART_Popup" AllowsTransparency="True" IsOpen="{TemplateBinding IsDropDownOpen}" Placement="Bottom" PopupAnimation="{DynamicResource {x:Static SystemParameters.ComboBoxPopupAnimationKey}}" Focusable="False">
                                        <Microsoft_Windows_Themes:SystemDropShadowChrome x:Name="Shdw" MaxHeight="{TemplateBinding MaxDropDownHeight}" MinWidth="{Binding ActualWidth, ElementName=Border}" Color="Transparent">
                                            <Border x:Name="DropDownBorder" Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}" BorderBrush="{DynamicResource {x:Static SystemColors.WindowFrameBrushKey}}" BorderThickness="1">
                                                <ScrollViewer>
                                                    <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" KeyboardNavigation.DirectionalNavigation="Contained"/>
                                                </ScrollViewer>
                                            </Border>
                                        </Microsoft_Windows_Themes:SystemDropShadowChrome>
                                    </Popup>
                                </Microsoft_Windows_Themes:ClassicBorderDecorator>
                                <DockPanel Margin="2">
                                    <FrameworkElement Width="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" DockPanel.Dock="Right"/>
                                    <Border x:Name="SelectedItemBorder" Margin="{TemplateBinding Padding}">
                                        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="1" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" Content="{TemplateBinding SelectionBoxItem}" ContentStringFormat="{TemplateBinding SelectionBoxItemStringFormat}" ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}"/>
                                    </Border>
                                </DockPanel>
                                <ToggleButton Margin="2" MinHeight="0" MinWidth="0" Width="Auto" Focusable="False" ClickMode="Press" IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}">
                                    <ToggleButton.Style>
                                        <Style TargetType="{x:Type ToggleButton}">
                                            <Setter Property="MinWidth" Value="0"/>
                                            <Setter Property="MinHeight" Value="0"/>
                                            <Setter Property="Width" Value="NaN"/>
                                            <Setter Property="Height" Value="NaN"/>
                                            <Setter Property="Background" Value="Transparent"/>
                                            <Setter Property="BorderBrush">
                                                <Setter.Value>
                                                    <SolidColorBrush/>
                                                </Setter.Value>
                                            </Setter>
                                            <Setter Property="BorderThickness" Value="2"/>
                                            <Setter Property="Template">
                                                <Setter.Value>
                                                    <ControlTemplate TargetType="{x:Type ToggleButton}">
                                                        <DockPanel SnapsToDevicePixels="True" Background="{TemplateBinding Background}" LastChildFill="False">
                                                            <Microsoft_Windows_Themes:ClassicBorderDecorator x:Name="Border" Width="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" DockPanel.Dock="Right" Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" BorderBrush="{TemplateBinding BorderBrush}" BorderStyle="AltRaised" BorderThickness="{TemplateBinding BorderThickness}">
                                                                <Path Fill="{TemplateBinding Foreground}" HorizontalAlignment="Center" VerticalAlignment="Center" Data="M0,0L3.5,4 7,0z"/>
                                                            </Microsoft_Windows_Themes:ClassicBorderDecorator>
                                                        </DockPanel>
                                                        <ControlTemplate.Triggers>
                                                            <Trigger Property="IsChecked" Value="True">
                                                                <Setter Property="BorderStyle" TargetName="Border" Value="AltPressed"/>
                                                            </Trigger>
                                                        </ControlTemplate.Triggers>
                                                    </ControlTemplate>
                                                </Setter.Value>
                                            </Setter>
                                            <Style.Triggers>
                                                <Trigger Property="IsEnabled" Value="False">
                                                    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}"/>
                                                </Trigger>
                                            </Style.Triggers>
                                        </Style>
                                    </ToggleButton.Style>
                                </ToggleButton>
                            </Grid>
                        </Border>
                        <ControlTemplate.Triggers>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="IsSelectionBoxHighlighted" Value="True"/>
                                    <Condition Property="IsDropDownOpen" Value="False"/>
                                </MultiTrigger.Conditions>
                                <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
                            </MultiTrigger>
                            <Trigger Property="IsSelectionBoxHighlighted" Value="True">
                                <Setter Property="Background" TargetName="SelectedItemBorder" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                            </Trigger>
                            <Trigger Property="HasItems" Value="False">
                                <Setter Property="MinHeight" TargetName="DropDownBorder" Value="95"/>
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="False">
                                <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                                <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                            </Trigger>
                            <Trigger Property="IsGrouping" Value="True">
                                <Setter Property="ScrollViewer.CanContentScroll" Value="False"/>
                            </Trigger>
                            <Trigger Property="HasDropShadow" SourceName="PART_Popup" Value="True">
                                <Setter Property="Margin" TargetName="Shdw" Value="0,0,5,5"/>
                                <Setter Property="Color" TargetName="Shdw" Value="#71000000"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <Trigger Property="IsEditable" Value="True">
                    <Setter Property="IsTabStop" Value="False"/>
                    <Setter Property="Padding" Value="1"/>
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type ComboBox}">
                                <Border SnapsToDevicePixels="True" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
                                    <Grid>
                                        <Microsoft_Windows_Themes:ClassicBorderDecorator x:Name="Border" Background="{TemplateBinding Background}" BorderStyle="Sunken" BorderThickness="2">
                                            <Microsoft_Windows_Themes:ClassicBorderDecorator.BorderBrush>
                                                <SolidColorBrush/>
                                            </Microsoft_Windows_Themes:ClassicBorderDecorator.BorderBrush>
                                            <Popup x:Name="PART_Popup" AllowsTransparency="True" IsOpen="{TemplateBinding IsDropDownOpen}" Placement="Bottom" PopupAnimation="{DynamicResource {x:Static SystemParameters.ComboBoxPopupAnimationKey}}" Focusable="False">
                                                <Microsoft_Windows_Themes:SystemDropShadowChrome x:Name="Shdw" MaxHeight="{TemplateBinding MaxDropDownHeight}" MinWidth="{Binding ActualWidth, ElementName=Border}" Color="Transparent">
                                                    <Border x:Name="DropDownBorder" Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}" BorderBrush="{DynamicResource {x:Static SystemColors.WindowFrameBrushKey}}" BorderThickness="1">
                                                        <ScrollViewer>
                                                            <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" KeyboardNavigation.DirectionalNavigation="Contained"/>
                                                        </ScrollViewer>
                                                    </Border>
                                                </Microsoft_Windows_Themes:SystemDropShadowChrome>
                                            </Popup>
                                        </Microsoft_Windows_Themes:ClassicBorderDecorator>
                                        <ToggleButton Margin="2" MinHeight="0" MinWidth="0" Width="Auto" Focusable="False" ClickMode="Press" IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}">
                                            <ToggleButton.Style>
                                                <Style TargetType="{x:Type ToggleButton}">
                                                    <Setter Property="MinWidth" Value="0"/>
                                                    <Setter Property="MinHeight" Value="0"/>
                                                    <Setter Property="Width" Value="NaN"/>
                                                    <Setter Property="Height" Value="NaN"/>
                                                    <Setter Property="Background" Value="Transparent"/>
                                                    <Setter Property="BorderBrush">
                                                        <Setter.Value>
                                                            <SolidColorBrush/>
                                                        </Setter.Value>
                                                    </Setter>
                                                    <Setter Property="BorderThickness" Value="2"/>
                                                    <Setter Property="Template">
                                                        <Setter.Value>
                                                            <ControlTemplate TargetType="{x:Type ToggleButton}">
                                                                <DockPanel SnapsToDevicePixels="True" Background="{TemplateBinding Background}" LastChildFill="False">
                                                                    <Microsoft_Windows_Themes:ClassicBorderDecorator x:Name="Border" Width="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" DockPanel.Dock="Right" Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" BorderBrush="{TemplateBinding BorderBrush}" BorderStyle="AltRaised" BorderThickness="{TemplateBinding BorderThickness}">
                                                                        <Path Fill="{TemplateBinding Foreground}" HorizontalAlignment="Center" VerticalAlignment="Center" Data="M0,0L3.5,4 7,0z"/>
                                                                    </Microsoft_Windows_Themes:ClassicBorderDecorator>
                                                                </DockPanel>
                                                                <ControlTemplate.Triggers>
                                                                    <Trigger Property="IsChecked" Value="True">
                                                                        <Setter Property="BorderStyle" TargetName="Border" Value="AltPressed"/>
                                                                    </Trigger>
                                                                </ControlTemplate.Triggers>
                                                            </ControlTemplate>
                                                        </Setter.Value>
                                                    </Setter>
                                                    <Style.Triggers>
                                                        <Trigger Property="IsEnabled" Value="False">
                                                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}"/>
                                                        </Trigger>
                                                    </Style.Triggers>
                                                </Style>
                                            </ToggleButton.Style>
                                        </ToggleButton>
                                        <DockPanel Margin="2">
                                            <FrameworkElement Width="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" DockPanel.Dock="Right"/>
                                            <TextBox x:Name="PART_EditableTextBox" Margin="{TemplateBinding Padding}" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" IsReadOnly="{Binding IsReadOnly, RelativeSource={RelativeSource TemplatedParent}}">
                                                <TextBox.Style>
                                                    <Style TargetType="{x:Type TextBox}">
                                                        <Setter Property="OverridesDefaultStyle" Value="True"/>
                                                        <Setter Property="AllowDrop" Value="True"/>
                                                        <Setter Property="MinWidth" Value="0"/>
                                                        <Setter Property="MinHeight" Value="0"/>
                                                        <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
                                                        <Setter Property="Template">
                                                            <Setter.Value>
                                                                <ControlTemplate TargetType="{x:Type TextBox}">
                                                                    <ScrollViewer x:Name="PART_ContentHost" Background="Transparent" Focusable="False" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden"/>
                                                                </ControlTemplate>
                                                            </Setter.Value>
                                                        </Setter>
                                                    </Style>
                                                </TextBox.Style>
                                            </TextBox>
                                        </DockPanel>
                                    </Grid>
                                </Border>
                                <ControlTemplate.Triggers>
                                    <Trigger Property="HasItems" Value="False">
                                        <Setter Property="MinHeight" TargetName="DropDownBorder" Value="95"/>
                                    </Trigger>
                                    <Trigger Property="HasDropShadow" SourceName="PART_Popup" Value="True">
                                        <Setter Property="Margin" TargetName="Shdw" Value="0,0,5,5"/>
                                        <Setter Property="Color" TargetName="Shdw" Value="#71000000"/>
                                    </Trigger>
                                    <Trigger Property="IsEnabled" Value="False">
                                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                                        <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                                    </Trigger>
                                    <Trigger Property="IsGrouping" Value="True">
                                        <Setter Property="ScrollViewer.CanContentScroll" Value="False"/>
                                    </Trigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>

    <Grid x:Name="LayoutRoot">
        <ComboBox HorizontalAlignment="Left" Margin="111,156,0,0" Style="{DynamicResource MyComboBoxStyle}" VerticalAlignment="Top" Width="197" Height="25"/>
    </Grid>
</Window>

Altri suggerimenti

La prima cosa che mi viene in mente sarebbe quella di cambiare la riga sotto indicata per accedere alla risorsa come StaticResource. Ciò genererà un errore di compilazione se il compilatore non ha trovato la risorsa. Inoltre, assicurati di definire la risorsa prima della riga in cui la usi effettivamente.

Style="{DynamicResource MyComboStyle}"
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top