1

I have the following diagram designer in which I'm trying to implement the feature of changing font size of text inside the figure. The combobox to the top right is responsible for doing that. enter image description here

The combobox is presented by the following XAML code in the ApplicationToolbar.xaml:

<ComboBox
        Height="20"
        Width="80"
                Loaded="{x:Static logic:DesignerItem.RoutedEvent}"
                SelectionChanged="{x:Static logic:DesignerItem.SelectionChangedEvent}"
        />

And the loaded/selected events are:

    public static RoutedEventHandler RoutedEvent = LoadFontSizes;
    public static SelectionChangedEventHandler SelectionChangedEvent = FontSizeChanged;
    public static void LoadFontSizes(object sender, RoutedEventArgs e)
    {
        // ... A List.
        var sizes = new List<short> { 8,11,14,18,24 };

        // ... Get the ComboBox reference.
        var comboBox = sender as ComboBox;

        // ... Assign the ItemsSource to the List.
        comboBox.ItemsSource = sizes;

        // ... Make the first item selected.
        comboBox.SelectedIndex = 0;
    }
    private static void FontSizeChanged(object sender, SelectionChangedEventArgs e)
    {
        // ... Get the ComboBox.
        var comboBox = sender as ComboBox;

        // ... Set SelectedItem as Window Title.
        var s = (short)comboBox.SelectedItem;
        // New values comes here, but how to update the dependency property??
    }

The text inside the item is held by following textbox:

<ControlTemplate x:Key="TextBoxDecoratorTemplate" TargetType="{x:Type Control}">
    <TextBox Width="Auto" Height="Auto" VerticalAlignment="Center" HorizontalAlignment="Center"
                 FontSize="{Binding TextFontSize}" Margin="1,1,0,0"  AcceptsReturn="True"
                 Background="Transparent" Text="{Binding Text}"/>
</ControlTemplate>

The whole DesignerItem.xaml is:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                xmlns:logic="clr-namespace:DD.Logic;assembly=DD.Logic"
                xmlns:itemsConnection="clr-namespace:DD.Logic.ItemsConnection;assembly=DD.Logic"
                xmlns:itemDecorators="clr-namespace:DD.Logic.ItemDecorators;assembly=DD.Logic"
                mc:Ignorable="d">

<!-- Connector Style -->
<Style TargetType="{x:Type itemsConnection:Connector}">
    <Setter Property="Width" Value="8"/>
    <Setter Property="Height" Value="8"/>
    <Setter Property="Cursor" Value="Cross"/>
    <Setter Property="SnapsToDevicePixels" Value="true"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type itemsConnection:Connector}">
                <Grid>
                    <!-- transparent extra space makes connector easier to hit -->
                    <Rectangle Fill="Transparent" Margin="-2"/>
                    <Rectangle Fill="Lavender" StrokeThickness="1" Stroke="#AA000080"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<!-- ConnectorDecoratorTemplate Default Template -->
<ControlTemplate x:Key="ConnectorDecoratorTemplate" TargetType="{x:Type Control}">
    <Grid Margin="-5">
        <itemsConnection:Connector x:Name="Left" Orientation="Left" VerticalAlignment="Center" HorizontalAlignment="Left"/>
        <itemsConnection:Connector x:Name="Top" Orientation="Top" VerticalAlignment="Top" HorizontalAlignment="Center"/>
        <itemsConnection:Connector x:Name="Right" Orientation="Right" VerticalAlignment="Center" HorizontalAlignment="Right"/>
        <itemsConnection:Connector x:Name="Bottom" Orientation="Bottom" VerticalAlignment="Bottom" HorizontalAlignment="Center"/>
    </Grid>
</ControlTemplate>

<!-- ResizeDecorator Default Template -->
<ControlTemplate x:Key="ResizeDecoratorTemplate" TargetType="{x:Type Control}">
    <Grid Opacity="0.7" SnapsToDevicePixels="true">
        <itemDecorators:ResizeThumb Height="3" Cursor="SizeNS" Margin="0 -4 0 0"
                 VerticalAlignment="Top" HorizontalAlignment="Stretch"/>
        <itemDecorators:ResizeThumb Width="3" Cursor="SizeWE" Margin="-4 0 0 0"
                 VerticalAlignment="Stretch" HorizontalAlignment="Left"/>
        <itemDecorators:ResizeThumb Width="3" Cursor="SizeWE" Margin="0 0 -4 0"
                 VerticalAlignment="Stretch" HorizontalAlignment="Right"/>
        <itemDecorators:ResizeThumb Height="3" Cursor="SizeNS" Margin="0 0 0 -4"
                 VerticalAlignment="Bottom" HorizontalAlignment="Stretch"/>
        <itemDecorators:ResizeThumb Width="7" Height="7" Cursor="SizeNWSE" Margin="-6 -6 0 0"
                 VerticalAlignment="Top" HorizontalAlignment="Left"/>
        <itemDecorators:ResizeThumb Width="7" Height="7" Cursor="SizeNESW" Margin="0 -6 -6 0"
                 VerticalAlignment="Top" HorizontalAlignment="Right"/>
        <itemDecorators:ResizeThumb Width="7" Height="7" Cursor="SizeNESW" Margin="-6 0 0 -6"
                 VerticalAlignment="Bottom" HorizontalAlignment="Left"/>
        <itemDecorators:ResizeThumb Width="7" Height="7" Cursor="SizeNWSE" Margin="0 0 -6 -6"
                 VerticalAlignment="Bottom" HorizontalAlignment="Right"/>
    </Grid>
</ControlTemplate>

<!-- DragThumb Default Template -->
<Style TargetType="{x:Type itemDecorators:DragThumb}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type itemDecorators:DragThumb}"/>
        </Setter.Value>
    </Setter>
</Style>

<!-- TextBoxDecorator Default Template -->
<ControlTemplate x:Key="TextBoxDecoratorTemplate" TargetType="{x:Type Control}">
    <TextBox Width="Auto" Height="Auto" VerticalAlignment="Center" HorizontalAlignment="Center"
                 FontSize="{Binding TextFontSize}" Margin="1,1,0,0"  AcceptsReturn="True"
                 Background="Transparent" Text="{Binding Text}"/>
</ControlTemplate>

<!-- DesignerItem Style -->
<Style TargetType="{x:Type logic:DesignerItem}">
    <Setter Property="MinWidth" Value="25"/>
    <Setter Property="MinHeight" Value="25"/>
    <Setter Property="SnapsToDevicePixels" Value="True"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type logic:DesignerItem}">
                <Grid DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}"
            ContextMenu="{StaticResource DesignerItemContextMenu}">

                    <!-- DragThumb -->
                    <itemDecorators:DragThumb x:Name="DragThumb" Cursor="SizeAll"/>
                    <!-- ResizeDecorator -->
                    <Control x:Name="ResizeDecorator" Visibility="Collapsed"
                          Template="{StaticResource ResizeDecoratorTemplate}"/>
                    <!-- ContentPresenter -->
                    <ContentPresenter x:Name="ContentPresenter" HorizontalAlignment="Stretch"
                          VerticalAlignment="Stretch" Content="{TemplateBinding ContentControl.Content}"
                          Margin="{TemplateBinding ContentControl.Padding}"/>
                    <!-- ConnectorDecorator -->
                    <Control x:Name="ConnectorDecorator" Visibility="Hidden"
                         Template="{StaticResource ConnectorDecoratorTemplate}"/>
                    <!-- TextBoxDecorator -->
                    <Control x:Name="TextBoxDecorator" Template="{StaticResource TextBoxDecoratorTemplate}"/>

                </Grid>
                <ControlTemplate.Triggers>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self},Path=Text}"/>
                    <DataTrigger Value="True" Binding="{Binding RelativeSource={RelativeSource Self},Path=IsSelected}">
                        <Setter TargetName="ResizeDecorator" Property="Visibility" Value="Visible"/>
                    </DataTrigger>
                    <DataTrigger Value="True" Binding="{Binding RelativeSource={RelativeSource Self},Path=IsDragConnectionOver}">
                        <Setter TargetName="ConnectorDecorator" Property="Visibility" Value="Visible"/>
                    </DataTrigger>
                    <Trigger Property="IsMouseOver" Value="true">
                        <Setter TargetName="ConnectorDecorator" Property="Visibility" Value="Visible"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

And I'm trying to bind the font size to following dependency property:

public class DesignerItem
{
public short TextFontSize
    {
        get { return (short)GetValue(FontSizeProperty); }
        set { SetValue(FontSizeProperty, value); }
    }
    public static DependencyProperty TextFontSizeProperty =
       DependencyProperty.Register("TextFontSize", typeof(short),
                                    typeof(DesignerItem),
new FrameworkPropertyMetadata(11));

//rest of the code
}

First issue is that I can not set default value. The error says that default value has the wrong type.
Second issue is that setting up the TextFontSize property programmatically (for example in the item's constructor) leads to the same error.
Third issue is that I can't update it inside of FontSizeChanged method as it's static.
Any tips about what is wrong with my approach are appricated:)

eXPerience
  • 346
  • 1
  • 3
  • 19
  • 1
    try cast default values to `short`: `new FrameworkPropertyMetadata((short)11)`. currently it is interpreted as `int`. btw, why `short`? it is signed type. i can understand byte, ushort, or int by default :\ – ASh Feb 17 '17 at 13:34
  • 2
    also I think `TextFontSizeProperty` and not `FontSizeProperty` should be used in getter in setter: `get { return (short)GetValue(TextFontSizeProperty); }`, `set { SetValue(TextFontSizeProperty, value); }` – ASh Feb 17 '17 at 13:36
  • @ASh I used ushort type and typecast and it helped to solve first two issues, thank you:) Now I need to get to understanding how to change that property when combo box selection changes.. – eXPerience Feb 17 '17 at 13:48
  • Font sizes in WPF are `double` values. You should also use that. – Clemens Feb 17 '17 at 13:54
  • @eXPerience, dependency property (DP) can have different values for different DesignerItems. at the moment I cannot find in your codes which items should be updated after selection change – ASh Feb 17 '17 at 13:55
  • @ASh I got that. I suppose I need to adress to Canvas that contains them all and update each item in a loop. – eXPerience Feb 17 '17 at 13:59

1 Answers1

0

I used method from this post to get my Canvas and then updated all it's items in a loop

Community
  • 1
  • 1
eXPerience
  • 346
  • 1
  • 3
  • 19