WPF Adorner Newbee

时间:2014-08-05 12:19:14

标签: wpf vb.net xaml

使用VB.Net& WPF

我正在Overlaying Controls in WPF with Adorners使用代码(转换为VB.Net)

MainWindow.xaml

<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid Name="G1">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>

    <TextBlock Text=" This is Parent Control " HorizontalAlignment="Center" VerticalAlignment="Center"/>
    <Button Grid.Row="1" Content="Show Child Control " HorizontalAlignment="Center" VerticalAlignment="Center" Click="Button_Click"/>
</Grid>
</Window>

背后的代码

Class MainWindow 

Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
    Dim U1 As New UserControl1
    Using OverlayAdorner(Of UserControl).Overlay(G1, U1)

    End Using
End Sub

End Class

UserControl1.xaml

UserControl x:Class="UserControl1"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<Grid Background=" #44000000">
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <Grid Grid.Row="1" Background="White" HorizontalAlignment="Center" VerticalAlignment="Center">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>

        <TextBlock Text=" This is Child Control " HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5"/>
        <TextBox Name="T1" Grid.Row="1" Margin="5"/>
        <Button Grid.Row="2" Content="Close Child Control " HorizontalAlignment="Center" VerticalAlignment="Center" Click="Button_Click" Margin="5"/>
    </Grid>
</Grid>

</UserControl>

背后的代码

Public Class UserControl1

Private Sub Button_Click(sender As Object, e As RoutedEventArgs)

End Sub

Public Property UserInput As String
    Get
        Return T1.Text
    End Get
    Set(value As String)
        T1.Text = value
    End Set
End Property
End Class

现在,当用户点击主窗口中的按钮时,usercontrol1应作为装饰者打开并允许用户在文本框中输入一些文本,当用户单击usercontrol1中的按钮时,它应该关闭并将文本返回到主窗口,在那里它将显示为消息框。

请帮助我和wpf

中的新手一样

1 个答案:

答案 0 :(得分:0)

我尝试编写基于xaml的纯解决方案,您可以根据需要进行调整

在此示例中有2个文本框,第1个是常规文件,而其他文本框在聚焦时弹出列表,允许您从中选择项目

示例代码

<Grid>
    <Grid.Resources>
        <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
    </Grid.Resources>
    <StackPanel  HorizontalAlignment="Center"
                 VerticalAlignment="Center"
                 MinWidth="200">
        <TextBox Text="regular textbox" />
        <TextBox Text="{Binding SelectedItem,ElementName=list,TargetNullValue=select an item}">
            <TextBox.Triggers>
                <EventTrigger RoutedEvent="GotFocus">
                    <BeginStoryboard>
                        <Storyboard>
                            <BooleanAnimationUsingKeyFrames Storyboard.TargetName="button"
                                                            Storyboard.TargetProperty="IsChecked">
                                <DiscreteBooleanKeyFrame Value="true"
                                                         KeyTime="0:0:0" />
                            </BooleanAnimationUsingKeyFrames>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </TextBox.Triggers>
        </TextBox>
    </StackPanel>
    <Border Background="#77000000"
            Visibility="{Binding IsChecked,ElementName=button,Converter={StaticResource BooleanToVisibilityConverter}}">
        <Grid HorizontalAlignment="Center"
              VerticalAlignment="Center"
              Width="300"
              Height="150">
            <ListBox x:Name="list">
                <sys:String>item 1</sys:String>
                <sys:String>item 2</sys:String>
                <sys:String>item 3</sys:String>
                <sys:String>item 4</sys:String>
                <ListBox.Triggers>
                    <EventTrigger RoutedEvent="MouseLeftButtonUp">
                        <BeginStoryboard>
                            <Storyboard>
                                <BooleanAnimationUsingKeyFrames Storyboard.TargetName="button"
                                                                Storyboard.TargetProperty="IsChecked">
                                    <DiscreteBooleanKeyFrame Value="False"
                                                             KeyTime="0:0:0" />
                                </BooleanAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                </ListBox.Triggers>
            </ListBox>
            <ToggleButton IsChecked="False"
                          x:Name="button"
                          HorizontalAlignment="Right"
                          VerticalAlignment="Top"
                          Content="X"
                          ToolTip="Close" />
            <Grid.Effect>
                <DropShadowEffect Opacity=".5" />
            </Grid.Effect>
        </Grid>
    </Border>
</Grid>

边框内网格的内容是您放置用户控件的位置

只需将此代码复制到新项目的主窗口并运行即可。试一试,看看这是否接近您的需求,我们可以根据您的需求进行调整。