2015-11-02 23 views
1

是否有一種方法可以合併此itemcontrol創建的所有文本框,以便我可以在單個文本框或文本塊中將它們全部選中?截至目前,我一次只能在單個文本塊中選擇文本。將TextBoxes合併爲ItemsSource中的一個

<ItemsControl Background="WhiteSmoke" ItemsSource="{Binding SelectedItemNotes}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Vertical"> 
       <TextBox IsReadOnly="True" Background="Transparent" BorderThickness="0"> 
        <TextBox.Text> 
         <MultiBinding StringFormat="{}{0} {1} - {3}"> 
          <Binding Path="Timestamp" /> 
          <Binding Path="UserName" /> 
          <Binding Path="Notes" /> 
         </MultiBinding> 
        </TextBox.Text> 
       </TextBox> 
      </StackPanel> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

回答

1

至於象文本選擇互動的話,你希望用戶在多個文本框的文本交互就好像它都在一個大的多行文本框:第四和第五之間的用戶點擊第一個框中的字符拖動到第三個框中的第九個字符之前,然後釋放鼠標左鍵。結果是選中第一個文本框中第四個字符後的所有內容,選擇第二個文本框,選擇第三個前八個字符。

沒有什麼會爲你做。你會編寫自定義的鼠標交互。我用鼠標完成了文本選擇,儘管只在一個控件中完成,並且比你意識到的更挑剔,但當它最終正常工作時,它非常棒。

所以你在你的控件類中設置了一些私有狀態,這樣鼠標事件就知道用戶正在進行這種超級選擇交互。 Mousedown並在ItemsControl中的文本框中拖動可以啓動該功能,在一個mouseup中可以結束它。

在mousemove上,您必須爲每個文本框設置SelectionStart/SelectionEnd,這些文本框位於您開始的文本框和您結束的文本框之間。對於你所結束的一個(如果它不是第一個),你必須做自定義代碼來找出鼠標結束的字符,並以編程方式設置SelectionStart和SelectionEnd。

不要忘記,用戶可以從文本框2拖動選擇「向上」到文本框0,您需要知道選擇要進行的方式。

一旦您知道哪些文本框在您的選擇中,請編寫一個枚舉這些文本框的屬性。鑑於此,一旦他們有相應的文本選擇,很容易得到充分的選擇文本:

// In order of first in UI to last, regardless of "selection direction" 
protected IEnumerable<TextBox> MegaSelectionTextBoxes { 
    get { 
     // Whatever -- might be a good idea to keep them 
     // in a List<TextBox> or ObservableCollection<TextBox> 
    } 
} 

// The easy part 
public String MegaSelectionText { 
    get { 
     return 
      String.Join("\n", 
         MegaSelectionTextBoxes.Select(
          tb=>tb.SelectedText)); 
    } 
} 

我自己,我不會讓指望在不到一週的時間很合適的工作。儘管你對「正確」的定義可能會更寬容。

但我更喜歡與XAML一起使用的方法,而不是試圖解決它。

如果是我,除非由於某種原因(有時候是這樣)這個功能非常關鍵,否則我會犧牲選擇中第一個和最後一個文本框中的部分選擇。

我會看看使用多列表ListBox而不是ItemsControl,所以我可以讓用戶選擇項目。然後,我將ListBox上的SelectedItems綁定到我的viewmodel上的ObservableCollection,然後在我的viewmodel上編寫一個Command,它可以根據所需的所有項目的連接文本執行任何操作。

另一種選擇是使用DataGrid中的多個單元格選擇。這會讓你得到你想要的互動,儘管你可能需要玩一些遊戲才能讓它看起來像你想要的那樣。

+0

選擇可能不是合適的詞彙。我希望能夠突出顯示所有文本,如單擊並拖動以選擇文本框中的所有文本。這可能使用多選列表框嗎? – Rob

+0

@Rob更新了我的答案,以解決這種情況。祝你好運!這看起來像一個非常有趣(閱讀:痛苦但有益的)功能,如果有堅實的商業案例花時間在上面。 –

+0

我決定只是使用一個StringBuilder,並將所有的值添加到我的ViewModel中,然後用一個新的行輸出一個大的字符串。在單個文本框中獲取所需的所有文本..但是可以動態更改字符串上某些單詞的顏色?不使用任何使用數據綁定和MVVM的代碼隱藏?我需要能夠爲每個用戶更改每個音符的顏色。 – Rob