0

I'm currently trying to organize my UI Xaml by splitting it into multiple files whenever it makes sense.

Because of that I'm exporting my TitleBar Styles into an extra file (\UI\Styles\TitleBarButtonStyles.xaml):

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Style x:Key="TitleBarButton" TargetType="{x:Type Button}"> <Setter Property="BorderThickness" Value="0,0,0,0" /> <Setter Property="Height" Value="18" /> <Setter Property="Width" Value="18" /> <Setter Property="WindowChrome.IsHitTestVisibleInChrome" Value="True" /> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Button}"> <Border Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" Background="{TemplateBinding Background}" CornerRadius="10"> <TextBlock Text="{TemplateBinding Content}" FontFamily="Segoe MDL2 Assets" FontSize="10" HorizontalAlignment="Center" VerticalAlignment="Center" RenderOptions.ClearTypeHint="Auto" TextOptions.TextRenderingMode="Aliased" TextOptions.TextFormattingMode="Display" /> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style> <!--Minimize--> <Style x:Key="MinimizeButton" TargetType="{x:Type Button}" BasedOn="{StaticResource TitleBarButton}"> <Setter Property="Content" Value="&#xE949;" /> <Setter Property="Background" Value="LimeGreen" /> </Style> <!--Maximize--> <Style x:Key="MaximizeButton" TargetType="{x:Type Button}" BasedOn="{StaticResource TitleBarButton}"> <Setter Property="Content" Value="&#xE739;" /> <Setter Property="Background" Value="Orange" /> </Style> <!--Restore--> <Style x:Key="RestoreButton" TargetType="{x:Type Button}" BasedOn="{StaticResource TitleBarButton}"> <Setter Property="Content" Value="&#xE923;" /> <Setter Property="Background" Value="Orange" /> <Setter Property="Visibility" Value="Collapsed" /> </Style> <!--Close--> <Style x:Key="CloseButton" TargetType="{x:Type Button}" BasedOn="{StaticResource TitleBarButton}"> <Setter Property="Content" Value="&#xE106;" /> <Setter Property="Background" Value="Firebrick" /> </Style> 

I then call it from the main file with:

 <Window.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="/UI/Styles/TitleBarButtonStyles.xaml" /> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Window.Resources> 

And on the buttons with:

<Button Style="{StaticResource MinimizeButton}" Grid.Column="2" Click="MinimizeBtn_OnClick" /> <Button x:Name="MaximizeBtn" Grid.Column="3" Style="{StaticResource MaximizeButton}" Click="MaximizeBtn_OnClick" /> <Button x:Name="RestoreBtn" Grid.Column="3" Style="{StaticResource RestoreButton}" Click="RestoreBtn_OnClick" /> <Button Style="{StaticResource CloseButton}" Grid.Column="4" Click="CloseBtn_OnClick" /> 

But on all buttons I get the error: Ressource 'STYLE_X_KEY_NAME' is not found (STYLE_X_KEY_NAME being the respective x:Key of the Style I wanted to apply)

Edit
Both files are in the same assembly.
I already tried the pack uri approach with:

<ResourceDictionary Source="pack://application:,,,/VRChat Bases Manager;component/UI/Styles/TitleBarButtonStyles.xaml" /> 

It still shows the same error.

Edit 2
The folderstructure here is as follows:

Main file: \UI\Windows\PrimaryWindow.xaml
The Style File: \UI\Styles\TitleBarButtonStyles.xaml

Edit 3
For some reason my file \UI\Styles\RoundDropDownStyle.xaml that gets called in the same way works.

Here the file:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Style x:Key="ComboboxTextBoxStyle" TargetType="{x:Type TextBox}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type TextBox}"> <Grid> <Border CornerRadius="8, 0, 0, 8" BorderThickness="1,1,0,1" Background="{TemplateBinding Background}" BorderBrush="#2A2A2A"> <ScrollViewer x:Name="PART_ContentHost" /> </Border> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style> <Style x:Key="ComboboxButtonStyle" TargetType="{x:Type ToggleButton}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ToggleButton}"> <Border Background="{TemplateBinding Background}" x:Name="border" CornerRadius="0,8,8,0" BorderThickness="0,1,1,1" BorderBrush="#2A2A2A"> <ContentPresenter /> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style> <Style x:Key="ComboboxStyle" TargetType="{x:Type ComboBox}"> <Setter Property="HorizontalContentAlignment" Value="Center" /> <Setter Property="VerticalContentAlignment" Value="Center" /> <Setter Property="SelectedIndex" Value="0"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ComboBox}"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition MaxWidth="18" /> </Grid.ColumnDefinitions> <TextBox Background="{TemplateBinding Background}" Name="PART_EditableTextBox" Style="{StaticResource ComboboxTextBoxStyle}" Padding="5,0,0,0" Height="{TemplateBinding Height}" IsReadOnly="True" /> <ToggleButton Background="{TemplateBinding Background}" Grid.Column="1" Margin="0" Height="{TemplateBinding Height}" Style="{StaticResource ComboboxButtonStyle}" Focusable="False" IsChecked="{Binding Path=IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" ClickMode="Press"> <Path Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center" Data="M 0 0 L 4 4 L 8 0 Z" Fill="DodgerBlue" /> </ToggleButton> <ContentPresenter Grid.Column="0" Name="ContentSite" Content="{TemplateBinding SelectionBoxItem}" ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="5,0,0,0" /> <Popup Grid.Column="0" Name="Popup" Placement="Bottom" IsOpen="{TemplateBinding IsDropDownOpen}" AllowsTransparency="True" Focusable="False" PopupAnimation="Slide"> <Grid Name="DropDown" SnapsToDevicePixels="True" MinWidth="{TemplateBinding ActualWidth}" MaxHeight="{TemplateBinding MaxDropDownHeight}"> <Border Background="{TemplateBinding Background}" x:Name="DropDownBorder" BorderThickness="1" CornerRadius="5" BorderBrush="#2A2A2A" /> <ScrollViewer Margin="4,6,4,6" SnapsToDevicePixels="True"> <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" /> </ScrollViewer> </Grid> </Popup> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style> 
2
  • Can you show your folder structure? Where is your "main" file and where are the styles defined in relation to that? Commented Oct 3, 2022 at 9:24
  • Added the path of both files @ewerspej Commented Oct 3, 2022 at 9:30

2 Answers 2

2

Okay I found the problem: It was the build action property on the file.
It was set to AdditionalFiles. The file that was working had it set to Page. Once I changed that it worked like a charm.

Apparently it's a weird behaviour by Visual Studio 2022?
When you create a file by Right Click -> Add... -> New Item... -> Resource Dictionary (WPF) it works fine.
If you go Right Click -> Add.. -> New From Template... -> Resource Dictionary it has the build action set to AdditionalFiles which doesn't work.

Edit I think the New from Template... is actually a feature added by ReSharper.

Sign up to request clarification or add additional context in comments.

1 Comment

Yes, "New from Template" is a ReSharper context menu add in.
1

Your Path should be,

<ResourceDictionary x:Name="TitleBarButtonStyles" Source="../Styles/TitleBarButtonStyles.xaml" /> 

As for your pack uri approach, you have spaces in URI. Consider Handling spaces in Uri path

3 Comments

I already tried it with .../ instead of /UI/. I also gave it a name already, but I have no Idea how to call a specific Style of the Dictionary then aside from the fact, that it still doesn't detect it.
Please mind that it must be ../ (two dots, not three). Can you check from within the code behind if Application.Current.Resources holds the styles from that ResourceDictionary?
@ewerspej Oh my mistake yeah it is ../, just had a typo in my answer. But the problem is not htat it doesn't find the file, just not the styles. When I type a wrong path it shows a different error^^ I did not declare any resources in <Application.Resources>. So I don't think I'd get a result there, right? It's only declared in the <Window.Resources>.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.