WPF - Добавление ObjectDataProvider ломает мой дизайнер

Возможно, я не использую ObjectDataProvider правильно, но я следую за примерами MSDN, поэтому я не уверен, что происходит не так.

Цель: когда я нажимаю кнопку, он закрывает окно, вызывая метод exitButtonMethod, который просто делает это.Close();.

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    xmlns:local="clr-namespace:WpfApplication1"
    Title="Window1" WindowStyle="None" AllowsTransparency="True"
    WindowStartupLocation="CenterScreen" mc:Ignorable="d" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" Height="254" Width="438" Opacity="1" Background="{x:Null}">

<Window.Resources>
    <ObjectDataProvider ObjectType="{x:Type local:Window1}"
                  MethodName="exitButtonMethod" x:Key="callExitButtonMethod">
    </ObjectDataProvider>
    <Style x:Key="ExitButtons" TargetType="{x:Type Button}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate x:Name="exitButtonTemplate" TargetType="Button">
                    <Grid>
                        <Ellipse x:Name="exitButtonEllipse" Fill="#597E0000"/>
                        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsPressed" Value="True">
                            <Setter TargetName="exitButtonEllipse" Property="Fill" Value="#897E0000" />
                            <Binding Source="{StaticResource callExitButtonMethod}"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>
<Grid Width="400" Height="200" Opacity="1">
    <Rectangle Height="200" HorizontalAlignment="Left" VerticalAlignment="Top" Name="rectangle1" Stroke="#FF7E0000" Width="400" RadiusX="40" RadiusY="40" Fill="#64860000" StrokeThickness="3" />
    <Button Style="{StaticResource ExitButtons}" Content="X" Height="25" Width="25" Margin="359,16,16,0" VerticalAlignment="Top" Focusable="True" FontSize="15" FontFamily="PMingLiU" Foreground="#FF7E0000" Opacity="1"/>
</Grid>

Ошибка в том, что он просто ломает мой конструктор и дает мне следующую ошибку в конструкторе:

System.Runtime.Remoting.RemotingException
[228940] Designer process terminated unexpectedly!

1 ответ

Назначение ObjectDataProvider состоит в создании объектов в XAML, к которым вы можете привязаться. Вы также можете использовать его для привязки к результатам вызова метода для этого объекта, что вы и пытаетесь сделать.

Здесь вы делаете новый объект с типом Window1 и привязка к методу callExitButtonMethod, Таким образом, вы случайно создаете новое окно внутри своего окна.

<ObjectDataProvider ObjectType="{x:Type local:Window1}"
                  MethodName="exitButtonMethod" x:Key="callExitButtonMethod">
    </ObjectDataProvider>

Теперь это новое окно, когда оно создано, также имеет окно внутри него... и т. Д., И вы получаете бесконечный цикл создания окон.

Вот почему вы получаете переполнение стека.

То, что вы пытаетесь сделать, гораздо проще, чем то, что вы делаете в настоящее время. Чтобы вызвать метод для кнопки, когда вы нажимаете на нее, вы можете просто сделать:

<Button Click="NameOfMethodHere" />

В вашем случае просто добавьте Click параметр к вашей кнопке и избавиться от ObjectDataProvider,

РЕДАКТИРОВАТЬ: Также для установки событий из стиля, см. EventSetter.

Другие вопросы по тегам