기본적으로 팝업에서 파생 된 매우 간단한 사용자 정의 컨트롤을 만들었습니다. 각 목록 상자 항목을 가질 수 있도록 해당 팝업을 목록 상자 datatemplate 안에 사용하고 싶습니다. 하지만이 오류 메시지가 나타납니다. "지정된 요소는 이미 다른 요소의 논리적 인 자식입니다. 먼저 연결을 끊습니다."이 메시지의 의미를 알고 있으며, 나는 이것을 과거에 처리해야했습니다. 그러나이 특정한 시나리오에서 나는 왜 그것을 처음에 얻는 지 이해하지 못합니다.목록 상자 데이터 템플릿에서 사용자 정의 컨트롤을 사용할 때 예외가 발생하는 이유
public class MyPopup : Popup
{
static MyPopup()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(MyPopup), new FrameworkPropertyMetadata(typeof(MyPopup)));
}
}
나는이 사용자 지정 컨트롤을 변경하는 경우 (일반 파일에) 그것을위한 스타일
<Style x:Key="MyPopupStyle" TargetType="{x:Type local:MyPopup}">
<Setter Property="Placement" Value="MousePoint" />
<Setter Property="Child">
<Setter.Value>
<Border
Width="100"
Height="100"
Background="HotPink" />
</Setter.Value>
</Setter>
<Setter Property="IsOpen" Value="{Binding RelativeSource={RelativeSource Self}, Path=PlacementTarget.IsMouseOver, Mode=OneWay}" />
</Style>
MainWindow를
<Window.Resources>
<DataTemplate x:Key="Foo">
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock x:Name="TextBlock" Text="Hover over" />
<wpfApp1:MyPopup PlacementTarget="{Binding ElementName=TextBlock}" />
</StackPanel>
</DataTemplate>
</Window.Resources>
<ListBox ItemTemplate="{StaticResource Foo}" ItemsSource="{Binding MyList}" />
코드
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
MyList = new List<string>{"Dan","John","Test"};
DataContext = this;
}
public List<string> MyList { get; }
}
뒤에 도출 컨트롤에서 포를 넣는다. 강아지의 컨트롤 템플릿 안에 다음 잘 작동하지만이보기를 소모 할 때이 팝업에서 액세스 할 속성을 잃게됩니다. 나는 의존성 프로퍼티를 생성 할 수 있다는 것을 알고 있지만, 여기에서 일어나는 일을 알고 싶습니다. 고맙습니다.
답장을 보내 주셔서 감사합니다. 아쉽게도 Popup 컨트롤에는 템플릿 속성이 없으므로 ControlTemplate을 사용할 수 없습니다. 거기에 어떤 다른 길 arround 그것, 팝업 들어 있습니까? – adminSoftDK