2016-12-28 99 views
0

我有一個文本框ACLBox,我想在用戶界面初始化時顯示一個字符串。初始化後,該字符串閃爍一秒鐘然後消失。爲什麼?爲什麼我的文本框加載文本消失

下面是文本框的XAML代碼:

 <Window x:Class="Funnel.ACL" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:Funnel" 
    mc:Ignorable="d" 
    Title="ACL Configuration" Height="300" Width="560" WindowStartupLocation="CenterScreen" 
    Closing="exitACL" 
    Background="LightGray" Name="ACLConfiguration"> 

<Grid> 
    <DockPanel> 
     <Grid x:Name="FunnelGrid" DockPanel.Dock="Top" ShowGridLines="False"> 

      <!--Defining Grid--> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="130"/> 
       <ColumnDefinition Width="40"/> 
       <ColumnDefinition Width="40"/> 
       <ColumnDefinition Width="40"/> 
       <ColumnDefinition Width="40"/> 
       <ColumnDefinition Width="30"/> 
       <ColumnDefinition Width="70"/> 
       <ColumnDefinition Width="75"/> 
       <ColumnDefinition Width="75"/> 
       <ColumnDefinition Width="75"/> 

      </Grid.ColumnDefinitions> 

      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="Auto" /> 
      </Grid.RowDefinitions> 

      <Label x:Name="Config" 
        Content="ACL CONFIGURATION" 
        Grid.Row="0" 
        Grid.Column="0" 
        Grid.ColumnSpan="9" 
        HorizontalAlignment="Center" 
        Foreground="Blue" 
        FontWeight="Heavy" 
        FontSize="16"> 
      </Label> 
      <CheckBox x:Name="aclCheckbox" 
         FlowDirection="RightToLeft" 
         Content="ACL ON" 
         Foreground="Blue" 
         FontWeight="Heavy" 
         FontSize="16" 
         Grid.Row="1" 
         Grid.Column="0" 
         Grid.RowSpan="1" 
         Grid.ColumnSpan="5" 
         HorizontalAlignment="Center" 
         Checked="ACL_Check" 
         Unchecked="ACL_Unchecked" 
         /> 

      <Label x:Name="AddIPAddress" Content="Add IP Address" Grid.Row="2" Grid.Column="0" Width="90" Height="30"></Label> 
      <TextBox x:Name="AddIPTextBox1" Grid.Row="2" Grid.Column="1" Width="35" Height="20" TextChanged="AddIPTextBox1_TextChanged"></TextBox> 
      <TextBox x:Name="AddIPTextBox2" Grid.Row="2" Grid.Column="2" Width="35" Height="20" TextChanged="AddIPTextBox2_TextChanged"></TextBox> 
      <TextBox x:Name="AddIPTextBox3" Grid.Row="2" Grid.Column="3" Width="35" Height="20" TextChanged="AddIPTextBox3_TextChanged"></TextBox> 
      <TextBox x:Name="AddIPTextBox4" Grid.Row="2" Grid.Column="4" Width="35" Height="20" TextChanged="AddIPTextBox4_TextChanged"></TextBox> 
      <TextBox x:Name="AddErrorBox" Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" HorizontalAlignment="Right" BorderThickness="0" Background="LightGray" FontSize="10" Text="{Binding AddErrorText}"/> 
      <Button x:Name="AddButton" Grid.Row="3" Grid.Column="1" Grid.ColumnSpan="4" HorizontalAlignment="Center" Height="25" Width="50" Click="addClick" FontSize="12" FontWeight="ExtraBold" Background="LightSteelBlue" VerticalAlignment="Top">ADD</Button> 

      <Label x:Name="DelIPAddress" Content="Remove IP Address" Grid.Row="4" Grid.Column="0" Width="120" Height="30"></Label> 
      <TextBox x:Name="DeleteIPTextBox1" Grid.Row="4" Grid.Column="1" Width="35" Height="20" TextChanged="DeleteIPTextBox1_TextChanged"></TextBox> 
      <TextBox x:Name="DeleteIPTextBox2" Grid.Row="4" Grid.Column="2" Width="35" Height="20" TextChanged="DeleteIPTextBox2_TextChanged"></TextBox> 
      <TextBox x:Name="DeleteIPTextBox3" Grid.Row="4" Grid.Column="3" Width="35" Height="20" TextChanged="DeleteIPTextBox3_TextChanged"></TextBox> 
      <TextBox x:Name="DeleteIPTextBox4" Grid.Row="4" Grid.Column="4" Width="35" Height="20" TextChanged="DeleteIPTextBox4_TextChanged"></TextBox> 
      <TextBox x:Name="DelErrorBox" Grid.Row="5" Grid.Column="0" Grid.ColumnSpan="2" HorizontalAlignment="Right" BorderThickness="0" Background="LightGray" FontSize="10" Text="{Binding DelErrorText}"/> 
      <Button x:Name="DeleteButton" Grid.Row="5" Grid.Column="1" Grid.ColumnSpan="4" HorizontalAlignment="Center" Height="25" Width="50" Click="deleteClick" FontSize="12" FontWeight="ExtraBold" Background="LightSteelBlue" VerticalAlignment="Top">DELETE</Button> 
      <Button x:Name="DeleteAllButton" Grid.Row="6" Grid.Column="1" Grid.ColumnSpan="4" HorizontalAlignment="Center" Height="25" Width="80" Click="deleteAllClick" FontSize="12" FontWeight="ExtraBold" Background="LightSteelBlue" VerticalAlignment="Top">REMOVE ALL</Button> 

      <Label x:Name="ACLBoxLabel" Content="Access Control List" Foreground="Blue" Grid.Row="1" Grid.Column="6" Grid.ColumnSpan="3" HorizontalAlignment="Center"></Label> 

      <TextBox x:Name="ACLBox" 
       ScrollViewer.HorizontalScrollBarVisibility="Auto" 
       ScrollViewer.VerticalScrollBarVisibility="Auto" 
       ScrollViewer.CanContentScroll="True" 
       Grid.Row="2" 
       Grid.Column="6" 
       Grid.RowSpan="4" 
       Grid.ColumnSpan="4" 
       HorizontalAlignment="Left" 
       VerticalAlignment="Center" 
       Width="220" 
       Height="150" 
       FontSize="14" 
       IsReadOnly="True" 
       Text="{Binding ACLBoxText}" 
       TextWrapping="Wrap" 
       TextAlignment="Center" /> 
     </Grid> 
    </DockPanel> 
</Grid> 

下面是該字符串的C#代碼:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Shapes; 

namespace Funnel 
{ 
    /// <summary> 
    /// Interaction logic for ACL.xaml 
    /// </summary> 
    public partial class ACL : Window 
    { 
     AclManager _manage = new AclManager(); 
     FileController _controller = new FileController(); 
     string addStr1; 
     string addStr2; 
     string addStr3; 
     string addStr4; 
     bool addError; 
    string delStr1; 
    string delStr2; 
    string delStr3; 
    string delStr4; 
    bool delError; 
    public string aclText; 
    public event PropertyChangedEventHandler PropertyChanged; 

    public ACL() 
    { 
     InitializeComponent(); 

     if(FunnelGlobals.accessControlList) 
     { 
      aclCheckbox.IsChecked = true; 
     } 

     aclText = _manage.getAclList(); 
    } 

    private void exitACL(object sender,System.ComponentModel.CancelEventArgs e) 
    { 
     _controller.writeAclFile(); 
    } 

    private void ACL_Check(object sender, RoutedEventArgs e) 
    { 
     FunnelGlobals.accessControlList = true; 
     aclText = _manage.getAclList(); 
    } 

    private void ACL_Unchecked(object sender, RoutedEventArgs e) 
    { 
     FunnelGlobals.accessControlList = false; 
     aclText = _manage.getAclList(); 
    } 

    private void AddIPTextBox1_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     AddErrorBox.Text = ""; 
     AddIPTextBox1.Text = AddIPTextBox1.Text; 
     addStr1 = AddIPTextBox1.Text; 
     if(!_manage.isDigit(addStr1)) 
     { 
      Color foreColor = (Color)new ColorConverter().ConvertFrom("red"); 
      Brush errBrush = new SolidColorBrush(foreColor); 
      AddErrorBox.Foreground = errBrush; 
      AddErrorBox.Text = "Character NOT Valid"; 
      addError = true; 
     } 
     else 
     { 
      addError = false; 
     } 
     ACLBox.Text = _manage.getAclList(); 
    } 
    private void AddIPTextBox2_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     AddErrorBox.Text = ""; 
     AddIPTextBox2.Text = AddIPTextBox2.Text; 
     addStr2 = AddIPTextBox2.Text; 
     if (!_manage.isDigit(addStr2)) 
     { 
      Color foreColor = (Color)new ColorConverter().ConvertFrom("red"); 
      Brush errBrush = new SolidColorBrush(foreColor); 
      AddErrorBox.Foreground = errBrush; 
      AddErrorBox.Text = "Character NOT Valid"; 
     } 
     aclText = _manage.getAclList(); 
    } 
    private void AddIPTextBox3_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     AddErrorBox.Text = ""; 
     AddIPTextBox3.Text = AddIPTextBox3.Text; 
     addStr3 = AddIPTextBox3.Text; 
     if (!_manage.isDigit(addStr3)) 
     { 
      Color foreColor = (Color)new ColorConverter().ConvertFrom("red"); 
      Brush errBrush = new SolidColorBrush(foreColor); 
      AddErrorBox.Foreground = errBrush; 
      AddErrorBox.Text = "Character NOT Valid"; 
     } 
     aclText = _manage.getAclList(); 
    } 
    private void AddIPTextBox4_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     AddErrorBox.Text = ""; 
     AddIPTextBox4.Text = AddIPTextBox4.Text; 
     addStr4 = AddIPTextBox4.Text; 
     if (!_manage.isDigit(addStr4)) 
     { 
      Color foreColor = (Color)new ColorConverter().ConvertFrom("red"); 
      Brush errBrush = new SolidColorBrush(foreColor); 
      AddErrorBox.Foreground = errBrush; 
      AddErrorBox.Text = "Character NOT Valid"; 
     } 
     aclText = _manage.getAclList(); 
    } 
    private void addClick(object sender, RoutedEventArgs e) 
    { 
     String addStr = addStr1 + "." + addStr2 + "." + addStr3 + "." + addStr4; 
     if(_manage.isLegit(addStr)) 
     { 
      FunnelGlobals.aclIPs.Add(addStr); 
     } 
     if(addError) 
     { 
      Color foreColor = (Color)new ColorConverter().ConvertFrom("red"); 
      Brush errBrush = new SolidColorBrush(foreColor); 
      AddErrorBox.Foreground = errBrush; 
      AddErrorBox.Text = "Fix Invalid Characters before Adding"; 
     } 
     else 
     { 
      aclText = _manage.getAclList(); 
     } 

    } 

    private void DeleteIPTextBox1_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     DelErrorBox.Text = ""; 
     DeleteIPTextBox1.Text = DeleteIPTextBox1.Text; 
     delStr1 = DeleteIPTextBox1.Text; 
     if (!_manage.isDigit(delStr1)) 
     { 
      Color foreColor = (Color)new ColorConverter().ConvertFrom("red"); 
      Brush errBrush = new SolidColorBrush(foreColor); 
      DelErrorBox.Foreground = errBrush; 
      DelErrorBox.Text = "Character NOT Valid"; 
      delError = true; 
     } 
     else 
     { 
      delError = false; 
     } 
    } 

    private void DeleteIPTextBox2_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     DelErrorBox.Text = ""; 
     DeleteIPTextBox2.Text = DeleteIPTextBox2.Text; 
     delStr2 = DeleteIPTextBox2.Text; 
     if (!_manage.isDigit(delStr2)) 
     { 
      Color foreColor = (Color)new ColorConverter().ConvertFrom("red"); 
      Brush errBrush = new SolidColorBrush(foreColor); 
      DelErrorBox.Foreground = errBrush; 
      DelErrorBox.Text = "Character NOT Valid"; 
      delError = true; 
     } 
     else 
     { 
      delError = false; 
     } 
    } 

    private void DeleteIPTextBox3_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     DelErrorBox.Text = ""; 
     DeleteIPTextBox3.Text = DeleteIPTextBox3.Text; 
     delStr3 = DeleteIPTextBox3.Text; 
     if (!_manage.isDigit(delStr3)) 
     { 
      Color foreColor = (Color)new ColorConverter().ConvertFrom("red"); 
      Brush errBrush = new SolidColorBrush(foreColor); 
      DelErrorBox.Foreground = errBrush; 
      DelErrorBox.Text = "Character NOT Valid"; 
      delError = true; 
     } 
     else 
     { 
      delError = false; 
     } 
    } 

    private void DeleteIPTextBox4_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     DelErrorBox.Text = ""; 
     DeleteIPTextBox4.Text = DeleteIPTextBox4.Text; 
     delStr4 = DeleteIPTextBox4.Text; 
     if (!_manage.isDigit(delStr4)) 
     { 
      Color foreColor = (Color)new ColorConverter().ConvertFrom("red"); 
      Brush errBrush = new SolidColorBrush(foreColor); 
      DelErrorBox.Foreground = errBrush; 
      DelErrorBox.Text = "Character NOT Valid"; 
      delError = true; 
     } 
     else 
     { 
      delError = false; 
     } 
    } 

    private void deleteClick(object sender, RoutedEventArgs e) 
    { 
     String delStr = delStr1 + "." + delStr2 + "." + delStr3 + "." + delStr4; 
     FunnelGlobals.aclIPs.Remove(delStr); 

     if (delError) 
     { 
      Color foreColor = (Color)new ColorConverter().ConvertFrom("red"); 
      Brush errBrush = new SolidColorBrush(foreColor); 
      DelErrorBox.Foreground = errBrush; 
      DelErrorBox.Text = "Fix Invalid Characters before Removing"; 
     } 
     else 
     { 
      aclText = _manage.getAclList(); 
     } 
    } 

    private void deleteAllClick(object sender, RoutedEventArgs e) 
    { 
     FunnelGlobals.aclIPs.Clear(); 
     aclText = _manage.getAclList(); 
    } 

    private void ACLBox_Loaded(object sender, RoutedEventArgs e) 
    { 
     ACLBox.Text = _manage.getAclList(); 
    } 
    public string ACLBoxText 
    { 
     get { return aclText; } 
     set { aclText = value; OnNotifyPropertyChanged("ACLBoxText"); } 
    } 

    private void OnNotifyPropertyChanged(string v) 
    { 
     var handler = PropertyChanged; 

     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(v)); 
     throw new NotImplementedException(); 
    } 
} 

}

+3

'ACLBoxText'爲空或空,對吧?你爲什麼綁定一個viewmodel屬性*並初始化'ACLBox。加載事件中的文本?不要這樣踩你自己。綁定'ACLBoxText'(你已經做了),並初始化'ACLBoxText'來初始化文本框中的內容。如果你綁定了一個viewmodel屬性,只需使用該屬性即可。擺脫那個Loaded處理程序。這可能是錯誤的;嘗試一下,看看你是否仍然有問題。 –

+0

只能通過'binding'或者僅通過後面的代碼來設置'Text'屬性。當你在後面的代碼中設置'property'時,'binding'被破壞。 – user1994514

+0

我希望文本來自用戶可以更新的列表......隨意添加或刪除。當用戶轉到列表配置時,我希望文本框顯示此列表。它閃爍到文本框中一秒鐘然後消失。然後,如果添加到列表中,列表將顯示並保留。除了現在我已經從下面的評論中添加了一些代碼之外,我正以完全相同的方式進行操作。該代碼仍然消失。我沒有看到代碼中可以覆蓋的地方。使用Visual Studio我查看了ACLBox.Text的每個實現,並且它始終設置爲_manage.getAclList(); –

回答

0

愛德賓吉已經提到的,你應該使用你的ACLBoxText支持變量,而不是重置控制值。

像這樣將工作:

private void ACLBox_Loaded(object sender, RoutedEventArgs e) 
{ 
    ACLBoxText = _manage.getAclList(); 
} 

不幸的是,鑑於不知道改變的後盾屬性,除非你告訴它的東西改變了。您需要實現INotifyPropertyChanged

private string _aclBoxText; 

public string ACLBoxText { 
    get { return _aclBoxText; } 
    set { 
     _aclBoxText = value; 
     OnNotifyPropertyChanged("ACLBoxText"); 
    } 
} 

protected void OnNotifyPropertyChanged(string name) 
{ 
    var handler = PropertyChanged; 

    if (handler != null) 
     handler(this, new PropertyChangedEventArgs(name)); 
} 

public event PropertyChangedEventHandler PropertyChanged; 
+0

如果OP將視圖轉換爲假視圖模型*並*設置this.DataContext = this;',那麼類似這樣的事情將會起作用,儘管這不是一種很好的做事方式。但我認爲你需要找出什麼(如果有的話)'ACLBoxText'實際上是第一個。如果有一個視圖模型,OP當然不應該丟棄它並像這樣重新開始。 –

+0

我添加了通知,併發生同樣的事情。 –

0

在初始化,對於第二串閃爍然後消失。爲什麼?

可能是因爲當您在Loaded事件處理程序中設置TextBlock的Text屬性時,「覆蓋」最初顯示在TextBlock中的ACLBoxText源屬性的值。

如果在加載UI時TextBlock爲空,則應確保_manage.getAclList()方法返回您期望它返回的字符串。你可以暫時嘗試Text屬性分配給一個「靜態」值:

private void ACLBox_Loaded(object sender, RoutedEventArgs e) 
{ 
    ACLBox.Text = "TEXT"; 
} 

但我同意,它並沒有多大意義,第一TextBlock的Text屬性綁定到源屬性在XAML標記,然後處理相同TextBlock的Loaded事件,並將其Text屬性設置爲此事件處理程序中的新值。但我想你有你的理由......

請注意,當你在你的Loaded處理程序中編程設置Text屬性時,你在XAML標記中定義的綁定將被重置。

因此,您應該不綁定XAML標記中的Text屬性,也不要處理Loaded事件並以編程方式設置Text屬性。它是一個或另一個,但不是兩個。

+0

如果我有一個靜態字符串值,那麼它就會出現並消失。我沒有看到任何會覆蓋該值的代碼。 –

+0

你Loaded事件中的代碼如何?這會覆蓋初始值。 – mm8

+0

加載的事件與初始值相同。除非加載事件,否則在添加另一個IP地址之前不會出現任何內容。然後整個列表加上新的IP出現在文本框中。 –

0

我想出了問題。這是我的第一個C#項目,也是第一次使用Xaml(wpf),所以我誤解了綁定。我像我在主要gui中那樣對文本進行了綁定。在這個gui中文本永遠不會被觸發,所以我只能看到文本因加載而閃爍,但是文本綁定會將文本框重置爲空。當我改變我的文本不受約束時,一切都按照我的意願工作。學過的知識。僅在從.cs文件訪問文本框時才需要綁定。這在xaml.cs中是不需要的。由於我的文本只會被xaml.cs觸發,只需設置文本,通常的方式(即textbox.text =「whatever」)就可以做我所需要的。感謝大家的幫助。我理解現在很好,現在好多了。 Java以不同的方式做事。 :)

相關問題