AX Agent 프리뷰 UI를 claw-code 스타일로 정리하고 프리뷰 surface를 공통화
Some checks failed
Release Gate / gate (push) Has been cancelled

- AX Agent 권한 승인 프리뷰에 공통 preview surface helper를 도입해 제목/요약/본문 box 구성을 일관되게 정리함
- 우측 파일 프리뷰 패널에 파일명, 경로, 형식·크기 메타 헤더를 추가하고 텍스트 프리뷰를 bordered preview box 안에 렌더하도록 개선함
- README와 DEVELOPMENT 문서에 2026-04-06 01:08 (KST) 기준 변경 이력 반영 완료
- dotnet build src/AxCopilot/AxCopilot.csproj -c Release -v minimal -p:OutputPath=bin\\verify\\ -p:IntermediateOutputPath=obj\\verify\\ 경고 0 / 오류 0 확인
This commit is contained in:
2026-04-05 22:03:16 +09:00
parent 53965083e3
commit 1948af3cc4
6 changed files with 239 additions and 139 deletions

View File

@@ -1086,3 +1086,7 @@ MIT License
- 업데이트: 2026-04-06 01:00 (KST) - 업데이트: 2026-04-06 01:00 (KST)
- AX Agent 메시지 hover 액션을 보강해 복사/편집/재생성/수정 후 재시도/좋아요·싫어요가 실제로 보이도록 정리했다. 사용자/assistant 메시지 액션 바를 완전 숨김 대신 기본 저강도 노출 + hover 강조 방식으로 바꿔, 마우스를 올렸을 때 액션이 안 보이던 문제를 줄였다. - AX Agent 메시지 hover 액션을 보강해 복사/편집/재생성/수정 후 재시도/좋아요·싫어요가 실제로 보이도록 정리했다. 사용자/assistant 메시지 액션 바를 완전 숨김 대신 기본 저강도 노출 + hover 강조 방식으로 바꿔, 마우스를 올렸을 때 액션이 안 보이던 문제를 줄였다.
- assistant 응답에는 응답시간과 총 토큰 수를 메시지 메타로 저장해 transcript 아래에 함께 표시되게 했다. 반영 위치는 [ChatModels.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Models/ChatModels.cs), [AxAgentExecutionEngine.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AxAgentExecutionEngine.cs), [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 이다. - assistant 응답에는 응답시간과 총 토큰 수를 메시지 메타로 저장해 transcript 아래에 함께 표시되게 했다. 반영 위치는 [ChatModels.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Models/ChatModels.cs), [AxAgentExecutionEngine.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AxAgentExecutionEngine.cs), [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 이다.
- 업데이트: 2026-04-06 01:08 (KST)
- `claw-code``SessionPreview`/`PreviewBox` 흐름을 참고해 AX Agent 프리뷰도 같은 시각 언어로 정리했다. 새 파일 [AgentPreviewSurfaceFactory.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/AgentPreviewSurfaceFactory.cs)를 추가해 권한 프리뷰 카드의 제목/요약/본문 박스 구조를 공통화했다.
- [PermissionRequestWindow.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/PermissionRequestWindow.cs)의 일반 프리뷰, 파일 편집 프리뷰, 파일 생성 2열 프리뷰를 이 공통 surface로 맞춰 `preview box` 언어를 통일했다.
- [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml), [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs)의 우측 파일 프리뷰 패널에는 파일명/경로/형식·크기 메타를 보여주는 헤더를 추가하고, 텍스트 프리뷰 본문도 별도 bordered preview box 안에 렌더되게 바꿨다.

View File

@@ -4846,3 +4846,8 @@ ow + toggle ?쒓컖 ?몄뼱濡??ㅼ떆 ?뺣젹?덈떎.
- [AxAgentExecutionEngine.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AxAgentExecutionEngine.cs) 의 `CommitAssistantMessage()` / `FinalizeAssistantTurn()`은 응답 메타를 함께 커밋하도록 확장했다. - [AxAgentExecutionEngine.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Services/Agent/AxAgentExecutionEngine.cs) 의 `CommitAssistantMessage()` / `FinalizeAssistantTurn()`은 응답 메타를 함께 커밋하도록 확장했다.
- [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 에서는 실행 완료 시 `_llm.LastTokenUsage`, 누적 에이전트 토큰, 응답 경과 시간을 assistant 메시지에 저장하고, transcript 렌더 시 `응답시간 · 총 토큰` 메타를 assistant bubble 아래에 함께 표시하도록 연결했다. - [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 에서는 실행 완료 시 `_llm.LastTokenUsage`, 누적 에이전트 토큰, 응답 경과 시간을 assistant 메시지에 저장하고, transcript 렌더 시 `응답시간 · 총 토큰` 메타를 assistant bubble 아래에 함께 표시하도록 연결했다.
- 사용자/assistant 메시지 액션 바는 완전 숨김(Opacity 0) 대신 기본 저강도 노출 + hover 시 100% 강조로 바꿨다. 이로써 메시지에 마우스를 올렸을 때 복사/편집/재생성/수정 후 재시도/좋아요·싫어요가 보이지 않던 UX 문제를 줄였다. - 사용자/assistant 메시지 액션 바는 완전 숨김(Opacity 0) 대신 기본 저강도 노출 + hover 시 100% 강조로 바꿨다. 이로써 메시지에 마우스를 올렸을 때 복사/편집/재생성/수정 후 재시도/좋아요·싫어요가 보이지 않던 UX 문제를 줄였다.
- 업데이트: 2026-04-06 01:08 (KST)
- `claw-code``SessionPreview.tsx`, `PreviewBox.tsx`를 참고해 AX Agent 프리뷰 surface를 공통화했다. [AgentPreviewSurfaceFactory.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/AgentPreviewSurfaceFactory.cs)를 추가해 `title + summary + preview box` 구조를 재사용 가능한 helper로 분리했다.
- [PermissionRequestWindow.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/PermissionRequestWindow.cs) 의 `BuildPreviewCard`, `BuildFileEditPreviewCard`, `BuildFileWriteTwoColumnPreviewCard`는 이 helper를 쓰도록 정리해 권한 승인 프리뷰가 같은 preview 언어를 따르도록 맞췄다.
- [ChatWindow.xaml](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml) 의 우측 프리뷰 패널 헤더를 `파일명 / 경로 / 형식·크기 메타` 구조로 재배치하고, [ChatWindow.xaml.cs](/E:/AX%20Copilot%20-%20Codex/src/AxCopilot/Views/ChatWindow.xaml.cs) 에 `SetPreviewHeader`, `SetPreviewHeaderState`를 추가해 현재 탭 파일 메타를 표시하도록 했다.
- 텍스트 프리뷰 본문도 bordered preview box 안에 렌더되게 바꿔, AX Agent 파일 프리뷰와 transcript/승인 프리뷰 사이 시각 언어를 더 가깝게 맞췄다.

View File

@@ -0,0 +1,85 @@
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace AxCopilot.Views;
internal static class AgentPreviewSurfaceFactory
{
internal static Border CreateSurface(
string title,
string summary,
UIElement body,
Brush primary,
Brush secondary,
Brush itemBackground,
Brush borderBrush,
Thickness? margin = null)
{
return new Border
{
Background = itemBackground,
BorderBrush = borderBrush,
BorderThickness = new Thickness(1),
CornerRadius = new CornerRadius(12),
Padding = new Thickness(12, 10, 12, 10),
Margin = margin ?? new Thickness(0, 8, 0, 0),
Child = new StackPanel
{
Children =
{
new TextBlock
{
Text = title,
FontSize = 12,
FontWeight = FontWeights.SemiBold,
Foreground = primary,
},
new TextBlock
{
Text = summary,
FontSize = 11,
Foreground = secondary,
Margin = new Thickness(0, 2, 0, 8),
TextWrapping = TextWrapping.Wrap,
},
body
}
}
};
}
internal static Border CreatePreviewBox(
string content,
Brush primary,
Brush secondary,
Brush borderBrush,
double maxHeight,
bool monospace = true)
{
var panel = new Border
{
Background = Brushes.Transparent,
BorderBrush = new SolidColorBrush(Color.FromArgb(0x20, 0x80, 0x80, 0x80)),
BorderThickness = new Thickness(1),
CornerRadius = new CornerRadius(8),
Padding = new Thickness(8, 6, 8, 6),
Child = new ScrollViewer
{
MaxHeight = maxHeight,
VerticalScrollBarVisibility = ScrollBarVisibility.Auto,
Content = new TextBlock
{
Text = string.IsNullOrWhiteSpace(content) ? "(empty)" : content,
Foreground = primary,
FontFamily = monospace ? new FontFamily("Consolas") : new FontFamily("Pretendard"),
FontSize = 11.2,
TextWrapping = TextWrapping.Wrap,
LineHeight = 18,
}
}
};
return panel;
}
}

View File

@@ -5240,43 +5240,88 @@
BorderBrush="{DynamicResource BorderColor}" BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1,0,0,0"> BorderThickness="1,0,0,0">
<DockPanel LastChildFill="True"> <DockPanel LastChildFill="True">
<!-- 탭 바 + 도구 버튼 (DockPanel.Top — WebView2 위에 독립 레이어) -->
<Border DockPanel.Dock="Top" Background="{DynamicResource HintBackground}" <Border DockPanel.Dock="Top" Background="{DynamicResource HintBackground}"
BorderBrush="{DynamicResource BorderColor}" BorderThickness="0,0,0,1" BorderBrush="{DynamicResource BorderColor}" BorderThickness="0,0,0,1"
Padding="0" Panel.ZIndex="10" Focusable="True" Padding="12,10,12,8">
PreviewMouseDown="PreviewTabBar_PreviewMouseDown"> <StackPanel>
<Grid> <Grid Margin="0,0,0,8">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/> <ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<ScrollViewer Grid.Column="0" HorizontalScrollBarVisibility="Hidden" <StackPanel>
VerticalScrollBarVisibility="Disabled" CanContentScroll="True"> <TextBlock x:Name="PreviewHeaderTitle"
<StackPanel x:Name="PreviewTabPanel" Orientation="Horizontal"/> Text="미리보기"
</ScrollViewer> FontSize="13"
<StackPanel Grid.Column="1" Orientation="Horizontal" Margin="4,0"> FontWeight="SemiBold"
<Button x:Name="BtnOpenExternal" Style="{StaticResource GhostBtn}" Padding="6" Foreground="{DynamicResource PrimaryText}"/>
Click="BtnOpenExternal_Click" ToolTip="외부 프로그램으로 열기" Cursor="Hand"> <TextBlock x:Name="PreviewHeaderSubtitle"
<TextBlock Text="&#xE8A7;" FontFamily="Segoe MDL2 Assets" FontSize="12" Text="선택한 파일이 여기에 표시됩니다"
Foreground="{DynamicResource SecondaryText}" IsHitTestVisible="False"/> FontSize="11.5"
</Button> Margin="0,2,0,0"
<Button Style="{StaticResource GhostBtn}" Padding="6" Foreground="{DynamicResource SecondaryText}"
Click="BtnClosePreview_Click" ToolTip="미리보기 닫기" Cursor="Hand"> TextTrimming="CharacterEllipsis"/>
<TextBlock Text="&#xE711;" FontFamily="Segoe MDL2 Assets" FontSize="10" </StackPanel>
Foreground="{DynamicResource SecondaryText}" IsHitTestVisible="False"/> <StackPanel Grid.Column="1" Orientation="Horizontal" Margin="8,0,0,0">
</Button> <Button x:Name="BtnOpenExternal" Style="{StaticResource GhostBtn}" Padding="6"
</StackPanel> Click="BtnOpenExternal_Click" ToolTip="외부 프로그램으로 열기" Cursor="Hand">
</Grid> <TextBlock Text="&#xE8A7;" FontFamily="Segoe MDL2 Assets" FontSize="12"
Foreground="{DynamicResource SecondaryText}" IsHitTestVisible="False"/>
</Button>
<Button Style="{StaticResource GhostBtn}" Padding="6"
Click="BtnClosePreview_Click" ToolTip="미리보기 닫기" Cursor="Hand">
<TextBlock Text="&#xE711;" FontFamily="Segoe MDL2 Assets" FontSize="10"
Foreground="{DynamicResource SecondaryText}" IsHitTestVisible="False"/>
</Button>
</StackPanel>
</Grid>
<Border Background="{DynamicResource LauncherBackground}"
BorderBrush="{DynamicResource BorderColor}" BorderThickness="1"
CornerRadius="10"
Padding="0"
Panel.ZIndex="10"
Focusable="True"
PreviewMouseDown="PreviewTabBar_PreviewMouseDown">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<ScrollViewer Grid.Column="0" HorizontalScrollBarVisibility="Hidden"
VerticalScrollBarVisibility="Disabled" CanContentScroll="True">
<StackPanel x:Name="PreviewTabPanel" Orientation="Horizontal"/>
</ScrollViewer>
<Border Grid.Column="1"
Margin="6,6,6,6"
Padding="8,4"
Background="{DynamicResource HintBackground}"
BorderBrush="{DynamicResource BorderColor}"
BorderThickness="1"
CornerRadius="999">
<TextBlock x:Name="PreviewHeaderMeta"
Text="파일 메타"
FontSize="10.5"
Foreground="{DynamicResource SecondaryText}"/>
</Border>
</Grid>
</Border>
</StackPanel>
</Border> </Border>
<!-- 미리보기 콘텐츠 영역 (DockPanel.Fill — WebView2는 여기에만 존재) --> <!-- 미리보기 콘텐츠 영역 (DockPanel.Fill — WebView2는 여기에만 존재) -->
<Grid ClipToBounds="True"> <Grid ClipToBounds="True" Background="{DynamicResource LauncherBackground}">
<wv2:WebView2 x:Name="PreviewWebView" Visibility="Collapsed"/> <wv2:WebView2 x:Name="PreviewWebView" Visibility="Collapsed"/>
<ScrollViewer x:Name="PreviewTextScroll" Visibility="Collapsed" <ScrollViewer x:Name="PreviewTextScroll" Visibility="Collapsed"
VerticalScrollBarVisibility="Auto" Padding="12,8"> VerticalScrollBarVisibility="Auto" Padding="16,14">
<TextBlock x:Name="PreviewTextBlock" TextWrapping="Wrap" <Border Background="{DynamicResource HintBackground}"
FontFamily="Consolas" FontSize="12" BorderBrush="{DynamicResource BorderColor}"
Foreground="{DynamicResource PrimaryText}"/> BorderThickness="1"
CornerRadius="12"
Padding="12,10">
<TextBlock x:Name="PreviewTextBlock" TextWrapping="Wrap"
FontFamily="Consolas" FontSize="12"
Foreground="{DynamicResource PrimaryText}"/>
</Border>
</ScrollViewer> </ScrollViewer>
<DataGrid x:Name="PreviewDataGrid" Visibility="Collapsed" <DataGrid x:Name="PreviewDataGrid" Visibility="Collapsed"
AutoGenerateColumns="True" IsReadOnly="True" AutoGenerateColumns="True" IsReadOnly="True"

View File

@@ -17460,6 +17460,7 @@ public partial class ChatWindow : Window
private async void LoadPreviewContent(string filePath) private async void LoadPreviewContent(string filePath)
{ {
var ext = System.IO.Path.GetExtension(filePath).ToLowerInvariant(); var ext = System.IO.Path.GetExtension(filePath).ToLowerInvariant();
SetPreviewHeader(filePath);
// 모든 콘텐츠 숨기기 // 모든 콘텐츠 숨기기
PreviewWebView.Visibility = Visibility.Collapsed; PreviewWebView.Visibility = Visibility.Collapsed;
@@ -17469,6 +17470,7 @@ public partial class ChatWindow : Window
if (!System.IO.File.Exists(filePath)) if (!System.IO.File.Exists(filePath))
{ {
SetPreviewHeaderState("파일을 찾을 수 없습니다");
PreviewEmpty.Text = "파일을 찾을 수 없습니다"; PreviewEmpty.Text = "파일을 찾을 수 없습니다";
PreviewEmpty.Visibility = Visibility.Visible; PreviewEmpty.Visibility = Visibility.Visible;
return; return;
@@ -17510,6 +17512,7 @@ public partial class ChatWindow : Window
break; break;
default: default:
SetPreviewHeaderState("지원되지 않는 형식");
PreviewEmpty.Text = "미리보기할 수 없는 파일 형식입니다"; PreviewEmpty.Text = "미리보기할 수 없는 파일 형식입니다";
PreviewEmpty.Visibility = Visibility.Visible; PreviewEmpty.Visibility = Visibility.Visible;
break; break;
@@ -17517,11 +17520,39 @@ public partial class ChatWindow : Window
} }
catch (Exception ex) catch (Exception ex)
{ {
SetPreviewHeaderState("미리보기 오류");
PreviewTextBlock.Text = $"미리보기 오류: {ex.Message}"; PreviewTextBlock.Text = $"미리보기 오류: {ex.Message}";
PreviewTextScroll.Visibility = Visibility.Visible; PreviewTextScroll.Visibility = Visibility.Visible;
} }
} }
private void SetPreviewHeader(string filePath)
{
if (PreviewHeaderTitle == null || PreviewHeaderSubtitle == null || PreviewHeaderMeta == null)
return;
var fileName = System.IO.Path.GetFileName(filePath);
var extension = System.IO.Path.GetExtension(filePath).TrimStart('.').ToUpperInvariant();
var fileInfo = new System.IO.FileInfo(filePath);
var sizeText = fileInfo.Exists
? fileInfo.Length >= 1024 * 1024
? $"{fileInfo.Length / 1024d / 1024d:F1} MB"
: $"{Math.Max(1, fileInfo.Length / 1024d):F0} KB"
: "파일 없음";
PreviewHeaderTitle.Text = string.IsNullOrWhiteSpace(fileName) ? "미리보기" : fileName;
PreviewHeaderSubtitle.Text = filePath;
PreviewHeaderMeta.Text = string.IsNullOrWhiteSpace(extension)
? sizeText
: $"{extension} · {sizeText}";
}
private void SetPreviewHeaderState(string state)
{
if (PreviewHeaderMeta != null && !string.IsNullOrWhiteSpace(state))
PreviewHeaderMeta.Text = state;
}
private bool _webViewInitialized; private bool _webViewInitialized;
private static readonly string WebView2DataFolder = private static readonly string WebView2DataFolder =
System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
@@ -17617,6 +17648,9 @@ public partial class ChatWindow : Window
{ {
_previewTabs.Clear(); _previewTabs.Clear();
_activePreviewTab = null; _activePreviewTab = null;
if (PreviewHeaderTitle != null) PreviewHeaderTitle.Text = "미리보기";
if (PreviewHeaderSubtitle != null) PreviewHeaderSubtitle.Text = "선택한 파일이 여기에 표시됩니다";
if (PreviewHeaderMeta != null) PreviewHeaderMeta.Text = "파일 메타";
PreviewColumn.Width = new GridLength(0); PreviewColumn.Width = new GridLength(0);
SplitterColumn.Width = new GridLength(0); SplitterColumn.Width = new GridLength(0);
PreviewPanel.Visibility = Visibility.Collapsed; PreviewPanel.Visibility = Visibility.Collapsed;

View File

@@ -581,48 +581,19 @@ internal sealed class PermissionRequestWindow : Window
Brush border, Brush border,
UiExpressionProfile uiProfile) UiExpressionProfile uiProfile)
{ {
return new Border return AgentPreviewSurfaceFactory.CreateSurface(
{ title,
Background = itemBg, summary,
BorderBrush = border, AgentPreviewSurfaceFactory.CreatePreviewBox(
BorderThickness = new Thickness(1), content,
CornerRadius = new CornerRadius(10), primary,
Padding = new Thickness(10, 8, 10, 8), secondary,
Margin = new Thickness(0, 8, 0, 0), border,
Child = new StackPanel uiProfile.PreviewMaxHeight),
{ primary,
Children = secondary,
{ itemBg,
new TextBlock border);
{
Text = title,
FontSize = 11.5,
FontWeight = FontWeights.SemiBold,
Foreground = primary,
},
new TextBlock
{
Text = summary,
FontSize = 11,
Foreground = secondary,
Margin = new Thickness(0, 2, 0, 6),
},
new TextBox
{
Text = content,
IsReadOnly = true,
BorderThickness = new Thickness(0),
Background = Brushes.Transparent,
Foreground = primary,
FontFamily = new FontFamily("Consolas"),
FontSize = 11,
MaxHeight = uiProfile.PreviewMaxHeight,
TextWrapping = TextWrapping.Wrap,
VerticalScrollBarVisibility = ScrollBarVisibility.Auto,
}
}
}
};
} }
private static Border BuildFileEditPreviewCard( private static Border BuildFileEditPreviewCard(
@@ -679,41 +650,19 @@ internal sealed class PermissionRequestWindow : Window
}); });
} }
return new Border return AgentPreviewSurfaceFactory.CreateSurface(
{ title,
Background = itemBg, summary,
BorderBrush = border, AgentPreviewSurfaceFactory.CreatePreviewBox(
BorderThickness = new Thickness(1), string.Join("\n", body.Children.OfType<TextBlock>().Select(tb => tb.Text)),
CornerRadius = new CornerRadius(10), primary,
Padding = new Thickness(10, 8, 10, 8), secondary,
Margin = new Thickness(0, 8, 0, 0), border,
Child = new StackPanel uiProfile.PreviewMaxHeight),
{ primary,
Children = secondary,
{ itemBg,
new TextBlock border);
{
Text = title,
FontSize = 11.5,
FontWeight = FontWeights.SemiBold,
Foreground = primary,
},
new TextBlock
{
Text = summary,
FontSize = 11,
Foreground = secondary,
Margin = new Thickness(0, 2, 0, 6),
},
new ScrollViewer
{
MaxHeight = uiProfile.PreviewMaxHeight,
VerticalScrollBarVisibility = ScrollBarVisibility.Auto,
Content = body,
}
}
}
};
} }
private static Border BuildFileWriteTwoColumnPreviewCard( private static Border BuildFileWriteTwoColumnPreviewCard(
@@ -764,36 +713,14 @@ internal sealed class PermissionRequestWindow : Window
Grid.SetColumn(newPanel, 2); Grid.SetColumn(newPanel, 2);
grid.Children.Add(newPanel); grid.Children.Add(newPanel);
return new Border return AgentPreviewSurfaceFactory.CreateSurface(
{ title,
Background = itemBg, summary,
BorderBrush = border, grid,
BorderThickness = new Thickness(1), primary,
CornerRadius = new CornerRadius(10), secondary,
Padding = new Thickness(10, 8, 10, 8), itemBg,
Margin = new Thickness(0, 8, 0, 0), border);
Child = new StackPanel
{
Children =
{
new TextBlock
{
Text = title,
FontSize = 11.5,
FontWeight = FontWeights.SemiBold,
Foreground = primary,
},
new TextBlock
{
Text = summary,
FontSize = 11,
Foreground = secondary,
Margin = new Thickness(0, 2, 0, 6),
},
grid,
}
}
};
} }
private static Border BuildWriteColumn( private static Border BuildWriteColumn(
@@ -1161,8 +1088,8 @@ internal sealed class PermissionRequestWindow : Window
Owner = owner, Owner = owner,
}; };
if (owner.Resources.MergedDictionaries.Count > 0) dialog.WindowStartupLocation = WindowStartupLocation.CenterOwner;
dialog.Resources.MergedDictionaries.Add(owner.Resources); dialog.Resources.MergedDictionaries.Add(owner.Resources);
dialog.ShowDialog(); dialog.ShowDialog();
return dialog._result; return dialog._result;