WPF控件不显示甚至使其可见
我遇到了一个我不知道如何解决的问题。我在主窗口上有“AddAccount”(按钮)、“AccountsTextBlock”和一个列表框。如果未添加用户,列表框将隐藏,一旦添加用户,列表框将在同一屏幕上显示ListBox、AddAccount和AccountsTextBlock,但AddAccount和AccountsTextBlock将位于与没有用户时不同的位置。问题是AddAccount和AccountsTextBlock没有显示,但显示了一个虚线矩形WPF控件不显示甚至使其可见,wpf,canvas,listbox,wpf-controls,redraw,Wpf,Canvas,Listbox,Wpf Controls,Redraw,我遇到了一个我不知道如何解决的问题。我在主窗口上有“AddAccount”(按钮)、“AccountsTextBlock”和一个列表框。如果未添加用户,列表框将隐藏,一旦添加用户,列表框将在同一屏幕上显示ListBox、AddAccount和AccountsTextBlock,但AddAccount和AccountsTextBlock将位于与没有用户时不同的位置。问题是AddAccount和AccountsTextBlock没有显示,但显示了一个虚线矩形 <Grid> <
<Grid>
<Canvas>
<TextBlock x:Name="AddAccountTextBlock" HorizontalAlignment="Left" TextWrapping="Wrap" VerticalAlignment="Top" Height="60" Width="369" Text="Add account to allow for simple access to your company resources
" SnapsToDevicePixels="True" Canvas.Left="38" Canvas.Top="313"/>
<Button x:Name="AddAccount" Content="Add Account" Canvas.Left="145" Canvas.Top="333" HorizontalAlignment="Left" VerticalAlignment="Top" Width="140" RenderTransformOrigin="0.466,0.977" IsCancel="True" Height="40" Foreground="White" Background="Blue" Click="OnAddAccount"/>
<TextBlock x:Name="AccountsTextBlock" Canvas.Left="176" TextWrapping="Wrap" Text="Accounts" Canvas.Top="10" Height="33" Width="68" FontSize="16" FontFamily="Tahoma"/>
</Canvas>
<ListBox x:Name="accounts" HorizontalAlignment="Left" Height="237" VerticalAlignment="Top" Width="444" SelectionChanged="ListBox_SelectionChanged" Background="White" BorderBrush="White" Margin="0,47,0,0" RenderTransformOrigin="0.5,0.5">
<ListBox.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform AngleX="0.384"/>
<RotateTransform/>
<TranslateTransform X="-0.794"/>
</TransformGroup>
</ListBox.RenderTransform>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Height" Value="100"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Border Name="_Border" BorderBrush="Gray" BorderThickness="0.5"
Padding="2"
SnapsToDevicePixels="true">
<ContentPresenter />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="true">
<Setter TargetName="_Border" Property="Background" Value="LightSkyBlue"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Margin="3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Image HorizontalAlignment="Left" VerticalAlignment="Center" Grid.Row="0" Grid.Column="0" Width="100" Source="{Binding Path=imagePath}" />
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Row="0" Grid.Column="1" Text="{Binding Path=userInfo}"></TextBlock>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
public MainWindow()
{
InitializeComponent();
using (RegistryKey key = Registry.CurrentUser.CreateSubKey(authenticatorRegistryKey))
{
Object valueStr = Registry.GetValue(authenticatorRegistryKey, addedUsersRegistryValueName, null);
if (valueStr == null)
{
//no users added yet, hide list box and move add button
accounts.Visibility = Visibility.Collapsed;
AccountsTextBlock.Visibility = Visibility.Collapsed;
Canvas.SetLeft(AddAccountTextBlock, (Application.Current.MainWindow.Width - AddAccountTextBlock.Width) / 2);
Canvas.SetTop(AddAccountTextBlock, (Application.Current.MainWindow.Height - AddAccountTextBlock.Height) / 2 - AddAccount.Height + 10);
Canvas.SetLeft(AddAccount, (Application.Current.MainWindow.Width - AddAccount.Width) / 2);
Canvas.SetTop(AddAccount, (Application.Current.MainWindow.Height - AddAccount.Height) / 2);
}
else
{
//show the added user
List<UserInfo> items = new List<UserInfo>();
items.Add(new UserInfo()
{
userInfo = "abcdefg",
imagePath = ""
});
accounts.ItemsSource = items;
AccountsTextBlock.Visibility = Visibility.Visible;
accounts.Visibility = Visibility.Visible;
}
}
}
private void OnAddAccount(object sender, RoutedEventArgs e)
{
SignInUrlWindow signInUrlWindow = new SignInUrlWindow();
signInUrlWindow.Left = Application.Current.MainWindow.Left;
signInUrlWindow.Top = Application.Current.MainWindow.Top;
signInUrlWindow.Width = Application.Current.MainWindow.Width;
signInUrlWindow.Height = Application.Current.MainWindow.Height;
signInUrlWindow.ShowDialog();
List<UserInfo> items = new List<UserInfo>();
items.Add(new UserInfo()
{
userInfo = "abcdefg",
imagePath = ""
});
accounts.ItemsSource = items;
accounts.Visibility = Visibility.Visible;
AddAccount.Visibility = Visibility.Visible;
AccountsTextBlock.Visibility = Visibility.Visible;
}
公共主窗口()
{
初始化组件();
使用(RegistryKey key=Registry.CurrentUser.CreateSubKey(AuthenticateTorRegistryKey))
{
Object valueStr=Registry.GetValue(authenticatorRegistryKey,addedUserRegistryValueName,null);
如果(valueStr==null)
{
//尚未添加用户,隐藏列表框并移动添加按钮
accounts.Visibility=Visibility.Collapsed;
AccountsTextBlock.Visibility=可见性。已折叠;
SetLeft(AddAccountTextBlock,(Application.Current.MainWindow.Width-AddAccountTextBlock.Width)/2);
SetTop(AddAccountTextBlock,(Application.Current.MainWindow.Height-AddAccountTextBlock.Height)/2-AddAccount.Height+10);
SetLeft(AddAccount,(Application.Current.MainWindow.Width-AddAccount.Width)/2);
SetTop(AddAccount,(Application.Current.MainWindow.Height-AddAccount.Height)/2);
}
其他的
{
//显示添加的用户
列表项=新列表();
items.Add(新用户信息()
{
userInfo=“abcdefg”,
imagePath=“”
});
accounts.ItemsSource=项目;
AccountsTextBlock.Visibility=可见性.Visibility;
accounts.Visibility=可见性.Visibility;
}
}
}
数据帐户上的私有void(对象发送方,RoutedEventArgs e)
{
SIGNINULWINDOW SIGNINULWINDOW=新SIGNINULWINDOW();
SIGNINULWINDOW.Left=Application.Current.MainWindow.Left;
signInUrlWindow.Top=Application.Current.MainWindow.Top;
SigninNurlWindow.Width=Application.Current.MainWindow.Width;
signinURL窗口高度=Application.Current.MainWindow.Height;
signInUrlWindow.ShowDialog();
列表项=新列表();
items.Add(新用户信息()
{
userInfo=“abcdefg”,
imagePath=“”
});
accounts.ItemsSource=项目;
accounts.Visibility=可见性.Visibility;
AddAccount.Visibility=可见性.Visibility;
AccountsTextBlock.Visibility=可见性.Visibility;
}
您是否考虑过在此处使用画布以外的面板?当你把画布和列表框放在网格的同一列和同一行时,为什么要把它们放在网格中呢?看起来你选择了一种糟糕的布局方法。无论如何,我根本不明白你为什么要在那里画画布。为什么不使用带有行和列的网格呢?为了探索这一点,我建议您首先注释掉隐藏和操纵UI大小和/或位置的所有代码。看看你得到了什么。我是wpf的新手,使用画布只是因为按钮的位置是动态的。你能推荐新的布局吗?UI布局最有用的面板可能是Grid和StackPanel。有很多wpf教程,这里有一个关于布局的教程,我认为这是一个很好的起点: