Why am I getting an exception from my dependency property?

I just spent several hours trying to plunge into the properties of dependencies (find a lot of useful information here on the site). I wrote my first dependency property, but it does not behave as I would like. Can someone take a look at my code and see if it can determine what happened? When I try to run the application I get a TargetInvocationException was thrown

<Window x:Class="TextEditorMVVM.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:c="clr-namespace:TextEditorMVVM.ViewModel" Title="MainWindow" Height="660" Width="621" ResizeMode="CanResize" Background="Gray"> <Window.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="pack://application:,,,/Resources/Dictionary1.xaml"/> </ResourceDictionary.MergedDictionaries> <c:TextEditorViewModel x:Key="TextEditorViewModel"></c:TextEditorViewModel> </ResourceDictionary> </Window.Resources> <Border CornerRadius="10" BorderThickness="12" Background="#FF505050"> <Border.BorderBrush> <LinearGradientBrush StartPoint="0,0" EndPoint="0,1"> <GradientStop Color="LightGray" Offset="1" /> <GradientStop Color="Gray" Offset="0" /> </LinearGradientBrush> </Border.BorderBrush> <StackPanel DataContext="{StaticResource TextEditorViewModel}"> <Menu Height="auto" Background="Transparent" Foreground="White"> <MenuItem Width=" auto" Height="auto" Header="_File" VerticalAlignment="Center"> <MenuItem Header="_New" Command="{Binding CreateNewTabCommand}"></MenuItem> <MenuItem Header="_Open" Command="{Binding OpenFileCommand}"></MenuItem> <MenuItem Header="_Save" Command="{Binding SaveFileCommand}"></MenuItem> <MenuItem Header="_Close" Command="{Binding CloseTabCommand}"></MenuItem> <MenuItem Header="_Print" Command="{Binding PrintCommand}"></MenuItem> <MenuItem Header="_Exit" Command="{Binding }"></MenuItem> </MenuItem> <MenuItem Width=" auto" Height="auto" Header="_Edit" VerticalAlignment="Center"> <MenuItem Header="_Cut" Command="ApplicationCommands.Cut"></MenuItem> <MenuItem Header="_Copy" Command="ApplicationCommands.Copy"></MenuItem> <MenuItem Header="_Paste" Command="ApplicationCommands.Paste"></MenuItem> </MenuItem> <MenuItem Width=" auto" Height="auto" Header="_Help" VerticalAlignment="Center"> <MenuItem Header="_Call Mikael" Command="{Binding }"></MenuItem> <MenuItem Header="_Call Semyon" Command="{Binding }"></MenuItem> <MenuItem Header="_Cry" Command="{Binding }"></MenuItem> </MenuItem> <Expander Header="Autosave" VerticalAlignment="Center" Foreground="White"> <StackPanel Orientation="Horizontal"> <CheckBox VerticalAlignment="Center" IsChecked="{Binding IsChecked, Mode=TwoWay}"></CheckBox> <TextBox Width="40" Height="20" Margin="4" ></TextBox> <Label VerticalAlignment="Center" Foreground="White">seconds</Label> </StackPanel> </Expander> </Menu> <c:TransparentTb IsTransparent="False" Text="Why aren't you working????"> </c:TransparentTb> <TabControl x:Name="_tabControl" ItemsSource="{Binding TestTab}" SelectedItem="{Binding SelectedTab}" Background="Transparent" BorderThickness="0"> <TabControl.ItemContainerStyle> <Style TargetType="TabItem"> <Setter Property="Header" Value="{Binding Title}"/> <Setter Property="Style" Value="Transparent"/> <Setter Property="Content" Value="{Binding InputText}"/> </Style> </TabControl.ItemContainerStyle> </TabControl> </StackPanel> </Border> 

 class TransparentTb : TextBlock { static TransparentTb() { } { get { return (bool) GetValue(IsTranparentProperty); } set { SetValue(IsTranparentProperty, value); } } // Using a DependencyProperty as the backing store for IsTranparent. This enables animation, styling, binding, etc... public static readonly DependencyProperty IsTranparentProperty = DependencyProperty.Register("IsTransparent", typeof (bool), typeof (TransparentTb), new UIPropertyMetadata(false, TransparentTb.IsTransparentPropertyChanged, TransparentTb.IsTransparentCoerce, false)); private static void IsTransparentPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { TransparentTb inst = (TransparentTb) d; if ((bool)e.NewValue == true) { inst.Background = Brushes.Transparent; } else inst.Background = Brushes.Black; } private static object IsTransparentCoerce(DependencyObject d, object value) { return value; } } 
+4
source share
1 answer

Changing this line Xaml ... <Setter property = "Style" Value = "Transparent" / ">

For this...

 <!-- <Setter Property="Style" Value="Transparent"/> --> 

(i.e. comment)

To avoid an exception.

Setting the style the way you do will entail a link to what is already defined in the object tree, for example {StaticResource Transparent}.

An internal exception is the "object reference not set ...", which makes it clear that the constructor cannot find the reference to the "Transparent" way it was encoded. Note that an exception occurs after TransparentTb is already constructed. You can prove this by setting breakpoints.

Also, I checked your TransparentTb code and it works great. The culprit is your TabItem style customization style.

+4
source

Source: https://habr.com/ru/post/1385435/


All Articles