/// <summary> /// キャストやセリフの入力のために適切なセリフデータグリッド行を選択する。 /// </summary> /// <param name="speechDataGrid">セリフデータグリッド。</param> /// <returns>成功したならば true 。そうでなければ false 。</returns> private Result <bool> SelectSpeechDataGridRowForInput(WpfDataGrid speechDataGrid) { if (speechDataGrid == null) { return(false, @"本体のセリフ一覧表が見つかりません。"); } switch (this.CastSpeechInputRow) { case CastSpeechInputRow.Blank: try { var selectedRow = speechDataGrid.SelectedRow; // 現在行のセリフセルが空なら現状のままでよい var cellText = speechDataGrid.GetCellText(selectedRow, 1); if (string.IsNullOrWhiteSpace(cellText)) { return(true); } // セリフセルが空の行を探す var rowCount = speechDataGrid.RowCount; for (int ri = selectedRow + 1; ri < rowCount; ++ri) { cellText = speechDataGrid.GetCellText(ri, 1); if (string.IsNullOrWhiteSpace(cellText)) { // 選択 speechDataGrid.Focus(); speechDataGrid.SelectedRow = ri; return(true); } } } catch (Exception ex) { ThreadTrace.WriteException(ex); return(false, @"本体のセリフ一覧表を操作できませんでした。"); } return(false, @"本体のセリフ一覧表にセリフ挿入可能な行がありません。"); case CastSpeechInputRow.Current: // 現状のまま return(true); } return(false, @"セリフ挿入先設定が不正な状態です。"); }
/// <summary> /// セリフデータグリッドのコンテキストメニューを初期化して取得する。 /// </summary> /// <param name="dataGrid">セリフデータグリッド。</param> /// <returns>コンテキストメニュー。</returns> private static dynamic InitializeContextMenu(WpfDataGrid dataGrid) { var menu = dataGrid.Base.ContextMenu; if (menu == null) { ThreadTrace.WriteLine(@"speechDataGrid.ContextMenu is null."); return(null); } foreach (var item in menu.Items) { // メニュー項目名取得 // Separator の場合があるので例外は握り潰す string header; try { header = (string)item.Header; } catch { continue; } // メニュー項目に null があるなら要初期化 if (header == null) { bool initOk = false; // うまくいかないことがあるので何度か試す for (int retry = 0; retry <= ContextMenuInitRetryCount; ++retry) { // 初期化 try { dataGrid.Focus(); menu.PlacementTarget = dataGrid.Base; try { menu.IsOpen = true; } finally { menu.IsOpen = false; } } finally { menu.PlacementTarget = null; } // 非 null になったか確認 if ((string)item.Header != null) { initOk = true; #if DEBUG if (retry > 0) { ThreadDebug.WriteLine( @"Retry count of initializing ContextMenu : " + retry); } #endif // DEBUG break; } Thread.Yield(); } if (!initOk) { ThreadTrace.WriteLine(@"item.Header is already null."); return(null); } break; } } return(menu); }