【发布时间】:2017-01-04 20:15:47
【问题描述】:
WPF 新手,试图弄清楚为什么我对 StatusBar 的样式更改不能可靠地工作。代码看起来很简单:
private void OnTryP4Login(object sender, RoutedEventArgs e)
{
statusText.Text = string.Format("Connecting to {0} as '{1}'.",
textBoxUri.Text, textBoxUser.Text); // <-- Doesn't work
statusBar.Background = Brushes.Yellow; // <-- Doesn't work
if (m_Manager.P4Login(textBoxUri.Text, textBoxUser.Text,
textBoxClientSpec.Text, passwordBox.Password))
{
statusText.Text = "SUCCESS!"; // <-- Doesn't work
statusBar.Background = Brushes.Green; // <-- Doesn't work
Thread.Sleep(2000);
this.Close();
}
else
{
statusBar.Background = Brushes.Red; // <-- THIS works
statusText.Text = "Error connecting to Perforce server!"; // <-- THIS works
buttonConnect.Visibility = Visibility.Collapsed;
buttonOK.Visibility = Visibility.Visible;
}
}
谁能以我的方式告诉我错误?
相关的 XAML:
<Window x:Class="WpfClient.P4LoginDialog"
[...]
Icon="feat.ico">
<DockPanel>
<Grid DockPanel.Dock="Top" Height="158">
[...]
<Button x:Name="buttonConnect" Content="Connect" Click="OnTryP4Login" HorizontalAlignment="Left" Margin="274,130,0,-18" VerticalAlignment="Top" Width="75"/>
</Grid>
<StatusBar x:Name="statusBar" Height="25" Background="#888" DockPanel.Dock="Bottom" HorizontalAlignment="Stretch" >
<TextBlock x:Name="statusText"
Width="Auto"
Height="Auto"
Foreground="#fff"
Text="Connect to P4 for live integration"
HorizontalAlignment="Right"
TextAlignment="Right"
/>
</StatusBar>
</DockPanel>
更新:多亏了这些建议,我已经能够通过执行以下操作使黄色文本正常工作。绿色成功消息仍然没有运气。为了完全理解执行流程和建议的全部含义,我阅读了大量关于 async 的内容(上次我做这样的事情时,BackgroundWorkers 风靡一时)。我感谢任何其他提示/解释。
private async void OnTryP4Login(object sender, RoutedEventArgs e)
{
statusText.Text = string.Format("Connecting to {0} as '{1}'.",
textBoxUri.Text, textBoxUser.Text); // <-- Works now
statusBar.Background = Brushes.DarkGoldenrod; // <-- Works now
Task<bool> getConnection = m_Manager.P4Login(textBoxUri.Text, textBoxUser.Text, textBoxClientSpec.Text, passwordBox.Password);
bool connection = await getConnection;
if (connection)
{
statusText.Text = "SUCCESS!"; // <-- Still doesn't work (stays DarkGoldenrod)
statusBar.Background = Brushes.Green; // <-- Still doesn't work (stays DarkGoldenrod)
Thread.Sleep(2000);
this.Close();
}
else
{
statusBar.Background = Brushes.Red; // <-- Still works
statusText.Text = "Error connecting to Perforce server!"; // <-- Still works
buttonConnect.Visibility = Visibility.Collapsed;
buttonOK.Visibility = Visibility.Visible;
}
}
public async Task<bool> P4Login(string uri, string user, string clientSpec, string password)
{
await Task.Delay(100);
return m_PI.Connect(uri, user, clientSpec, password);
}
【问题讨论】:
-
你在哪里附加事件处理程序
OnTryP4Login? -
您的代码如何知道何时需要触发
OnTryP4Login事件? -
添加到主帖: 代码肯定会触发,有时(在连接失败时)会正确到达 Else {} 语句。
-
可能
P4Login方法返回的太快了,你看不到黄色? -
我到处都有 Thread.Sleep() 以确保事情不会进展得太快。您还将在上面的代码中看到 2 秒的等待,在此期间绿色状态栏应该可见。