2013-10-04 51 views
1

我的WPF應用程序代碼生成在.cs文件中定義的function call上的面板。在代碼中使用ItemControl來生成這些​​。我想要在此ItemControl中定義名稱文本框並在代碼中使用它。我將它命名爲textEdit1並在代碼中使用它,但代碼生成的錯誤textEdit1不存在。有誰能解決我的問題嗎?下面的代碼是:ItemsControl文本框名稱在.cs文件中不工作

XAML文件:

<dxlc:ScrollBox> 
    <ItemsControl Name="lstPanels"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="vertical"> 
        <Grid> 
         <dxe:TextEdit Height="165" Text="{Binding Text, 
            Mode=TwoWay}" x:Name="textEdit1"/> 
        </Grid> 
       </StackPanel> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</dxlc:ScrollBox> 

cs文件

public partial class Window1 : Window 
{ 
    string valuu; 
    public Window1() 
    { 
     InitializeComponent(); 
     addPanel("Header1"); 
     addPanel("Header2"); 
     addPanel("Header3"); 
     lstPanels.ItemsSource = panels; 

    } 
    public ObservableCollection<MyPanel> panels = new ObservableCollection<MyPanel>(); 
    public void addPanel(string buttonId) 
    { 
     MyPanel p = new MyPanel { Id = buttonId}; 
     panels.Add(p); 
     functionb(p); 
    } 
    public void functionb(MyPanel obj) 
    {   
     valuu = obj.Text;    
    } 

    private void button2_Click(object sender, RoutedEventArgs e) 
    { 
     foreach (var f in panels.ToList()) 
     { 
      MessageBox.Show(f.Id + " *** " + f.Text); 
     } 
    } 
} 

public class MyPanel : INotifyPropertyChanged 
{ 
    private string _id; 
    private string _text; 

    public string Id 
    { 
     get { return _id; } 
     set 
     { 
      if (value != _id) 
      { 
       _id = value; 
       NotifyPropertyChanged(); 
      } 
     } 
    } 
    public string Text 
    { 
     get { return _text; } 
     set 
     { 
      if (value != _text) 
      { 
       _text = value; 
       NotifyPropertyChanged(); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void NotifyPropertyChanged( String propertyName = "") 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

回答

2

我看到您正在爲TextBox和ScrollBox使用一些第三方庫。如果您向我提供這些庫的名稱,我可以看看它們,因爲這些功能可能與WPF具有的功能不同。
至於現在你有3個選項(我給了標準的文本框和ItemsControl的例子):

我)你不必在所有訪問該文本框。
周圍有一個簡單的方法在這裏描述:StackOverflow post

II)處理事件,並引用文本框後面的代碼

  1. 添加Loaded事件到您的文本框:

    <TextBox x:Name="txtText" Width="300" Height="100" Loaded="txtText_Loaded" /> 
    
  2. 將一個字段添加到MyPanel類中以保存對TextBox的引用:

    public class MyPanel 
    { 
        public string Text { get; set; } 
        public TextBox TextBox { get; set; } 
        /* the rest ... */ 
    } 
    
  3. 計數器添加到您的窗口,旁邊的列表,包括面板:如果您想

    private void txtText_Loaded(object sender, RoutedEventArgs e) 
    { 
        panels[counter].TextBox = (TextBox)sender; 
        counter++; 
    } 
    
  4. protected ObservableCollection<MyPanel> panels = new ObservableCollection<MyPanel>(); 
    private int counter = 0; 
    
  5. 處理TextBox的Load事件訪問一個特定的TextBox,這樣做:

    MessageBox.Show(panels[i].TextBox.Text); 
    

III)添加額外的綁定字號:

  1. 一個字號屬性添加到您的MyPanel類:

    private double _fontSize = 10; 
    public double FontSize 
    { 
        get { return _fontSize; } 
        set 
        { 
         if (value != _fontSize) 
         { 
          _fontSize = value; 
          NotifyPropertyChanged(); 
         } 
        } 
    } 
    
  2. 綁定剛剛添加的屬性在你的ItemsControl的文本框:

    <TextBox x:Name="txtText" Width="300" Height="100" Text="{Binding Text;, Mode=TwoWay}" 
         FontSize="{Binding FontSize, Mode=OneWay}" /> 
    
  3. 滑塊添加到模板,並將其綁定到相同的屬性:

    <Slider Minimum="10" Maximum="30" Value="{Binding FontSize, Mode=TwoWay}" /> 
    

這樣,如果你改變一個滑塊的值,它會改變勢必面板在MyPanel對象的值。這反過來會改變文本框的字體大小。

我的整個代碼我測試看起來像這樣:

<ItemsControl x:Name="lstItems" > 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Vertical"> 
        <TextBox x:Name="txtText" Width="300" Height="100" Text="{Binding Text;, Mode=TwoWay}" FontSize="{Binding FontSize, Mode=OneWay}" /> 
        <Slider Minimum="10" Maximum="30" Value="{Binding FontSize, Mode=TwoWay}" /> 
       </StackPanel> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 

而後面的代碼:

public partial class MainWindow : Window 
{ 
    protected ObservableCollection<MyPanel> texts = new ObservableCollection<MyPanel>(); 

    public MainWindow() 
    { 
     InitializeComponent(); 

     texts.Add(new MyPanel() { Text = "Test 1" }); 
     texts.Add(new MyPanel() { Text = "Test 2" }); 

     lstItems.ItemsSource = texts; 
    } 
} 

public class MyPanel : INotifyPropertyChanged 
{ 
    private string _id; 
    private string _text; 
    private double _fontSize = 10; 

    public string Id 
    { 
     get { return _id; } 
     set 
     { 
      if (value != _id) 
      { 
       _id = value; 
       NotifyPropertyChanged(); 
      } 
     } 
    } 
    public string Text 
    { 
     get { return _text; } 
     set 
     { 
      if (value != _text) 
      { 
       _text = value; 
       NotifyPropertyChanged(); 
      } 
     } 
    } 
    public double FontSize 
    { 
     get { return _fontSize; } 
     set 
     { 
      if (value != _fontSize) 
      { 
       _fontSize = value; 
       NotifyPropertyChanged(); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void NotifyPropertyChanged(String propertyName = "") 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

我個人會去的最後的解決方案。
但是,讓我知道你正在使用什麼庫,當我有一些時間時我會看看它們。祝你好運。

+0

感謝您的迴應!丹尼爾我正在使用Devexpress TextEdit。它的所有屬性都與WPF中的TextBox相似!好的,你有沒有讀過我的評論'好吧,讓我解釋一下:ItemControl中有面板,每個面板都有唯一的ID,但是頭部相同。現在在每個面板中都有一個文本框和一個滑塊。所選滑塊將增加其面板中文本的字體大小。如何獲取此面板的所選Slider以將更改應用於textbox.Text,因爲有很多面板? 「我需要所有這些與textbox.Text一起玩。通過使用滑塊和按鈕增加字體大小,對齊等。 – user2835256

+1

嗯,我想你最好的選擇是使用我描述的第三個選項。 –

+0

我用標籤來獲取選定的滑塊現在問題是如何獲得該選定的滑塊面板的textbox.Text? – user2835256

2

textEdit1是將要多次實例化一個模板的一部分,所以將有多個textEdit1的實例。在類中爲textEdit1生成字段是沒有意義的,因爲它只能引用一個實例TextEdit控件...

+0

感謝回覆!有沒有其他的選擇? – user2835256

+0

@ user2835256,替代做什麼?你沒有說你想要達到什麼...... –

+0

我想命名這個文本編輯器,將修改應用到用戶寫入的文本中。 – user2835256

相關問題