Files
2025-08-26 08:37:44 +08:00

242 lines
17 KiB
XML

<UserControl xmlns="https://github.com/avaloniaui"
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"
mc:Ignorable="d" d:DesignHeight="660" d:DesignWidth="815"
xmlns:vm ="clr-namespace:常用工具集.ViewModel._02网络相关"
xmlns:utils="clr-namespace:常用工具集.Utility"
x:Class="常用工具集.FTP客户端"
xmlns:i="clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity"
x:CompileBindings="True"
x:DataType="vm:FTP客户端ViewModel">
<!-- xmlns:b="clr-namespace:Avalonia.Xaml.Behaviors;assembly=Avalonia.Xaml.Behaviors" -->
<UserControl.DataContext>
<vm:FTP客户端ViewModel />
</UserControl.DataContext>
<Grid>
<TextBlock HorizontalAlignment="Left" VerticalAlignment="Top" Text="IP地址:" Margin="10,16,0,0"/>
<TextBox IsEnabled="{Binding EnableFlag1}" HorizontalAlignment="Left" Margin="60,10,0,0" TextWrapping="Wrap" Text="{Binding IpAddress}" VerticalAlignment="Top" Width="120" />
<TextBlock HorizontalAlignment="Left" VerticalAlignment="Top" Text="端口号:" Margin="200,16,0,0"/>
<TextBox IsEnabled="{Binding EnableFlag1}" HorizontalAlignment="Left" Margin="250,10,0,0" TextWrapping="Wrap" Text="{Binding Port}" VerticalAlignment="Top" Width="105" />
<TextBlock HorizontalAlignment="Left" VerticalAlignment="Top" Text="字符编码:" Margin="369,16,0,0"/>
<ComboBox HorizontalAlignment="Left" IsEnabled="{Binding EnableFlag1}" VerticalAlignment="Top" SelectedIndex="{Binding EncodingIndex}" ItemsSource="{Binding StrEncodingList}" Margin="439,10,0,0" Width="90" />
<Button Content="建立连接" IsEnabled="{Binding EnableFlag1}" Command="{Binding ConnectCmd}" HorizontalAlignment="Left" Margin="557,10,0,0" VerticalAlignment="Top" Width="85" RenderTransformOrigin="0.539,0.527" />
<Button Content="断开连接" IsEnabled="{Binding EnableFlag2}" Command="{Binding DisconnectCmd}" HorizontalAlignment="Left" Margin="655,10,0,0" VerticalAlignment="Top" Width="85" />
<TextBlock HorizontalAlignment="Left" VerticalAlignment="Top" Text="用户名:" Margin="10,56,0,0"/>
<TextBox IsEnabled="{Binding EnableFlag1}" HorizontalAlignment="Left" Margin="60,50,0,0" TextWrapping="Wrap" Text="{Binding UserName}" VerticalAlignment="Top" Width="120" />
<TextBlock HorizontalAlignment="Left" VerticalAlignment="Top" Text="密码:" Margin="210,56,0,0"/>
<TextBox IsEnabled="{Binding EnableFlag1}" HorizontalAlignment="Left" Margin="250,50,0,0" TextWrapping="Wrap" Text="{Binding Password}" VerticalAlignment="Top" Width="105" />
<CheckBox IsChecked="{Binding IsAnonymous}" IsEnabled="{Binding EnableFlag1}" Content="匿名登录" Margin="425,52,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" Height="24" />
<Button Width="25" Height="25" Margin="25,95,0,0" Background="#1296db" HorizontalAlignment="Left" VerticalAlignment="Top" Command="{Binding LocalHomeClickCommand}">
<Button.Template>
<ControlTemplate TargetType="Button">
<Grid Background="Transparent">
<Path Fill="{TemplateBinding Button.Background}"
Stretch="Fill" Data="M916.16 360.494L562.622 79.919C529.939 55.927 484.353 57 452.924 82.5L104.497 360.535c-19.798 16.064-31.225 39.73-31.225 64.668V919.3c0 21.173 17.164 38.337 38.337 38.337H320.31c21.173 0 38.337-17.164 38.337-38.337V682.871c0-34.874 29.614-63.407 65.809-63.407h175.289c36.195 0 65.809 28.533 65.809 63.407V919.3c0 21.173 17.164 38.337 38.337 38.337H912.39c21.173 0 38.337-17.164 38.337-38.337V427.742c0.001-26.385-12.784-51.258-34.567-67.248z" />
</Grid>
</ControlTemplate>
</Button.Template>
</Button>
<Button Width="25" Height="25" Margin="65,95,0,0" Background="#1296db" HorizontalAlignment="Left" VerticalAlignment="Top" Command="{Binding LocalDoubleClickCommand}" CommandParameter="{Binding LocalTreeSelectedItem}">
<Button.Template>
<ControlTemplate TargetType="Button">
<Grid Background="Transparent">
<Path Fill="{TemplateBinding Button.Background}"
Stretch="Fill" Data="M467.86 64c47.68 0 91.95 11.98 133.27 35.7 41.33 23.72 74.1 56.25 98.55 97.57s36.68 86.32 36.68 135.48c0 37.66-7.34 73.12-22.01 105.89s-35.21 61.87-61.87 87.06l-44.02-18.83c25.19-21.03 45.24-46.46 59.91-76.54s22.01-62.6 22.01-97.57c0-40.59-9.78-78.01-29.34-112.25-19.56-34.23-46.46-61.63-80.7-81.92s-71.65-30.32-112.24-30.32c-40.59 0-78.01 10.02-112.24 30.32s-61.63 47.68-81.92 81.92c-20.3 34.23-30.32 71.65-30.32 112.25 0 44.75 12.23 85.59 36.68 122.76s56.98 64.8 97.57 82.9v48.17c-53.07-19.56-96.11-52.57-129.12-98.55-32.77-46.22-49.4-97.82-49.4-155.29 0-48.91 11.98-94.15 35.7-135.48s56.25-73.85 97.57-97.57C373.71 75.74 418.95 64 467.86 64z m0 90.24c48.91 0 90.97 17.61 125.94 52.57s52.58 77.03 52.58 125.94c0 33.51-8.07 64.07-24.21 91.21-16.14 27.39-38.15 48.66-66.03 64.07V433.5c30.81-26.66 46.22-59.42 46.22-98.55s-13.21-71.65-39.86-97.57c-26.65-25.92-58.45-38.88-95.37-38.88s-68.47 12.96-94.39 38.88-38.88 58.44-38.88 97.57 14.67 72.14 44.02 98.55v54.53c-27.88-15.4-50.13-36.68-66.03-64.07-16.14-27.39-24.21-57.71-24.21-91.21 0-48.91 17.61-90.97 52.58-125.94 34.47-35.21 77.26-52.57 127.64-52.57z m-46.22 178.27c0-12.47 4.64-22.99 13.7-31.55 9.05-8.32 20.05-12.47 32.52-12.47s22.99 4.16 31.55 12.47c8.56 8.32 12.47 18.83 12.47 31.55v199.3l54.53 6.36 220.33 98.55c12.47 5.62 22.01 13.7 28.37 24.21 6.36 10.51 9.54 22.74 9.54 36.68v195.14c0 18.1-6.6 33.51-20.05 46.22-13.21 12.47-29.1 19.56-47.2 21.03H467.86c-18.1 0-33.5-7.09-46.22-21.03L203.27 752.14l33.5-35.7c8.31-8.32 18.83-12.47 31.55-12.47h10.52l142.81 75.57-0.01-447.03z" />
</Grid>
</ControlTemplate>
</Button.Template>
</Button>
<Border Theme="{StaticResource CardBorder}" Width="320" Height="335" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="25,130,0,0">
<Grid>
<TextBlock HorizontalAlignment="Left" Margin="0,-20,0,0" TextWrapping="Wrap" Text="{Binding LocalPath1}" VerticalAlignment="Top"/>
<DataGrid HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
IsReadOnly="True"
ItemsSource="{Binding LocalTree}"
SelectedItem="{Binding LocalTreeSelectedItem}"
RowHeight="30"
AutoGenerateColumns="False" GridLinesVisibility="None">
<!--<i:Interaction.Triggers>
<b:EventTrigger EventName="MouseLeftButtonUp">
<b:InvokeCommandAction Command="{Binding LocalClickCommand}" CommandParameter="{Binding SelectedItem}" />
</i:EventTrigger>
<b:EventTrigger EventName="MouseDoubleClick">
<b:InvokeCommandAction Command="{Binding LocalDoubleClickCommand}" CommandParameter="{Binding LocalTreeSelectedItem}" />
</b:EventTrigger>
</b:Interaction.Triggers>-->
<DataGrid.Columns>
<DataGridTemplateColumn Header="名称" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Center" Height="20">
<Image Margin="2" HorizontalAlignment="Center" VerticalAlignment="Center" Tag="{Binding IsDirectory}">
<Image.Styles>
<Style Selector="Image[Tag=True]">
<Setter Property="Source" Value="/Assets/FTP/Folder.png" />
</Style>
<Style Selector="Image[Tag=False]">
<Setter Property="Source" Value="/Assets/FTP/File.png" />
</Style>
</Image.Styles>
</Image>
<TextBlock Text="{Binding Name}" Margin="2" HorizontalAlignment="Center" VerticalAlignment="Center" Tag="{Binding Path}"/>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Border>
<Button IsEnabled="{Binding EnableFlag2}" Width="48" Height="22" Margin="369,243,0,0" Background="#1296db" HorizontalAlignment="Left" VerticalAlignment="Top" Command="{Binding DownloadClickCommand}">
<Button.Template>
<ControlTemplate TargetType="Button">
<Grid Background="Transparent">
<Path Fill="{TemplateBinding Button.Background}"
Stretch="Fill"
Data="M185.4,87.5H95.8V56.4c0-2-0.6-3.9-1.6-5.6c-3.1-4.9-9.5-6.3-14.4-3.2L9.9,91.9c-1.3,0.8-2.5,2-3.3,3.3
c-3,4.9-1.5,11.3,3.4,14.3L80,152.7v0c1.6,1,3.5,1.5,5.5,1.5c5.8,0,10.4-4.7,10.4-10.4v-31.3h89.6c5.8,0,10.4-4.7,10.4-10.4v-4.2
C195.8,92.2,191.2,87.5,185.4,87.5z" />
</Grid>
</ControlTemplate>
</Button.Template>
</Button>
<Button IsEnabled="{Binding EnableFlag2}" Width="48" Height="22" Margin="369,308,0,0" Background="#1296db" HorizontalAlignment="Left" VerticalAlignment="Top" Command="{Binding UploadClickCommand}">
<Button.Template>
<ControlTemplate TargetType="Button">
<Grid Background="Transparent">
<Path Fill="{TemplateBinding Button.Background}"
Stretch="Fill"
Data="M15.5,87.5h89.6V56.4c0-2,0.6-3.9,1.6-5.6c3.1-4.9,9.5-6.3,14.4-3.2L191,91.9c1.3,0.8,2.5,2,3.3,3.3
c3,4.9,1.5,11.3-3.4,14.3l-69.9,43.1v0c-1.6,1-3.5,1.5-5.5,1.5c-5.8,0-10.4-4.7-10.4-10.4v-31.3H15.5c-5.8,0-10.4-4.7-10.4-10.4
v-4.2C5.1,92.2,9.7,87.5,15.5,87.5z" />
</Grid>
</ControlTemplate>
</Button.Template>
</Button>
<Button IsEnabled="{Binding EnableFlag2}" Width="25" Height="25" Margin="495,95,0,0" Background="#1296db" HorizontalAlignment="Left" VerticalAlignment="Top" Command="{Binding RemoteRenameClickCommand}">
<Button.Template>
<ControlTemplate TargetType="Button">
<Grid Background="Transparent">
<Path Fill="{TemplateBinding Button.Background}"
Stretch="Fill" Data="M105.4,137.9h-65c-3,0-5.4-2.4-5.4-5.4v-65c0-3,2.4-5.4,5.4-5.4h65c3,0,5.4,2.4,5.4,5.4s-2.4,5.4-5.4,5.4H45.8
v54.2h59.6c3,0,5.4,2.4,5.4,5.4S108.4,137.9,105.4,137.9z M62.1,94.6c-3,0-5.4,2.4-5.4,5.4s2.4,5.4,5.4,5.4h32.5
c3,0,5.4-2.4,5.4-5.4s-2.4-5.4-5.4-5.4H62.1z M148.8,159.6h-16.3V40.4h16.3c3,0,5.4-2.4,5.4-5.4s-2.4-5.4-5.4-5.4h-43.4
c-3,0-5.4,2.4-5.4,5.4s2.4,5.4,5.4,5.4h16.3v119.2h-16.3c-3,0-5.4,2.4-5.4,5.4s2.4,5.4,5.4,5.4h43.4c3,0,5.4-2.4,5.4-5.4
S151.8,159.6,148.8,159.6z M159.6,62.1h-10.8c-3,0-5.4,2.4-5.4,5.4s2.4,5.4,5.4,5.4h5.4v54.2h-5.4c-3,0-5.4,2.4-5.4,5.4
s2.4,5.4,5.4,5.4h10.8c3,0,5.4-2.4,5.4-5.4v-65C165,64.5,162.6,62.1,159.6,62.1z" />
</Grid>
</ControlTemplate>
</Button.Template>
</Button>
<Button IsEnabled="{Binding EnableFlag2}" Width="25" Height="25" Margin="540,95,0,0" Background="#1296db" HorizontalAlignment="Left" VerticalAlignment="Top" Command="{Binding RemoteDeleteClickCommand}">
<Button.Template>
<ControlTemplate TargetType="Button">
<Grid Background="Transparent">
<Path Fill="{TemplateBinding Button.Background}"
Stretch="Fill" Data="M160,60c-5.5,0-10,4.5-10,10l0,0v110H50V70c0-5.5-4.5-10-10-10c-5.5,0-10,4.5-10,10v120c0,5.5,4.5,10,10,10h120
c5.5,0,10-4.5,10-10l0,0V70C170,64.5,165.5,60,160,60C160,60,160,60,160,60z M80,160V80c0-5.5-4.5-10-10-10c-5.5,0-10,4.5-10,10v80
c0,5.5,4.5,10,10,10C75.5,170,80,165.5,80,160z M110,160V80c0-5.5-4.5-10-10-10c-5.5,0-10,4.5-10,10v80c0,5.5,4.5,10,10,10
C105.5,170,110,165.5,110,160z M140,160V80c0-5.5-4.5-10-10-10c-5.5,0-10,4.5-10,10v80c0,5.5,4.5,10,10,10
C135.5,170,140,165.5,140,160z M190,30h-50V20c0-11-9-20-20-20c0,0,0,0,0,0H80C69,0,60,9,60,20v10H10C4.5,30,0,34.5,0,40
c0,5.5,4.5,10,10,10h180c5.5,0,10-4.5,10-10C200,34.5,195.5,30,190,30z M80,30V20h40v10H80z" />
</Grid>
</ControlTemplate>
</Button.Template>
</Button>
<Button IsEnabled="{Binding EnableFlag2}" Width="24" Height="25" Margin="448,95,0,0" Background="#1296db" HorizontalAlignment="Left" VerticalAlignment="Top" Command="{Binding RemoteHomeClickCommand}">
<Button.Template>
<ControlTemplate TargetType="Button">
<Grid Background="Transparent">
<Path Fill="{TemplateBinding Button.Background}"
Stretch="Fill" Data="M916.16 360.494L562.622 79.919C529.939 55.927 484.353 57 452.924 82.5L104.497 360.535c-19.798 16.064-31.225 39.73-31.225 64.668V919.3c0 21.173 17.164 38.337 38.337 38.337H320.31c21.173 0 38.337-17.164 38.337-38.337V682.871c0-34.874 29.614-63.407 65.809-63.407h175.289c36.195 0 65.809 28.533 65.809 63.407V919.3c0 21.173 17.164 38.337 38.337 38.337H912.39c21.173 0 38.337-17.164 38.337-38.337V427.742c0.001-26.385-12.784-51.258-34.567-67.248z" />
</Grid>
</ControlTemplate>
</Button.Template>
</Button>
<Button Width="25" Height="25" Margin="585,95,0,0" Background="#1296db" HorizontalAlignment="Left" VerticalAlignment="Top" Command="{Binding RemoteDoubleClickCommand}" CommandParameter="{Binding RemoteTreeSelectedItem}">
<Button.Template>
<ControlTemplate TargetType="Button">
<Grid Background="Transparent">
<Path Fill="{TemplateBinding Button.Background}"
Stretch="Fill" Data="M467.86 64c47.68 0 91.95 11.98 133.27 35.7 41.33 23.72 74.1 56.25 98.55 97.57s36.68 86.32 36.68 135.48c0 37.66-7.34 73.12-22.01 105.89s-35.21 61.87-61.87 87.06l-44.02-18.83c25.19-21.03 45.24-46.46 59.91-76.54s22.01-62.6 22.01-97.57c0-40.59-9.78-78.01-29.34-112.25-19.56-34.23-46.46-61.63-80.7-81.92s-71.65-30.32-112.24-30.32c-40.59 0-78.01 10.02-112.24 30.32s-61.63 47.68-81.92 81.92c-20.3 34.23-30.32 71.65-30.32 112.25 0 44.75 12.23 85.59 36.68 122.76s56.98 64.8 97.57 82.9v48.17c-53.07-19.56-96.11-52.57-129.12-98.55-32.77-46.22-49.4-97.82-49.4-155.29 0-48.91 11.98-94.15 35.7-135.48s56.25-73.85 97.57-97.57C373.71 75.74 418.95 64 467.86 64z m0 90.24c48.91 0 90.97 17.61 125.94 52.57s52.58 77.03 52.58 125.94c0 33.51-8.07 64.07-24.21 91.21-16.14 27.39-38.15 48.66-66.03 64.07V433.5c30.81-26.66 46.22-59.42 46.22-98.55s-13.21-71.65-39.86-97.57c-26.65-25.92-58.45-38.88-95.37-38.88s-68.47 12.96-94.39 38.88-38.88 58.44-38.88 97.57 14.67 72.14 44.02 98.55v54.53c-27.88-15.4-50.13-36.68-66.03-64.07-16.14-27.39-24.21-57.71-24.21-91.21 0-48.91 17.61-90.97 52.58-125.94 34.47-35.21 77.26-52.57 127.64-52.57z m-46.22 178.27c0-12.47 4.64-22.99 13.7-31.55 9.05-8.32 20.05-12.47 32.52-12.47s22.99 4.16 31.55 12.47c8.56 8.32 12.47 18.83 12.47 31.55v199.3l54.53 6.36 220.33 98.55c12.47 5.62 22.01 13.7 28.37 24.21 6.36 10.51 9.54 22.74 9.54 36.68v195.14c0 18.1-6.6 33.51-20.05 46.22-13.21 12.47-29.1 19.56-47.2 21.03H467.86c-18.1 0-33.5-7.09-46.22-21.03L203.27 752.14l33.5-35.7c8.31-8.32 18.83-12.47 31.55-12.47h10.52l142.81 75.57-0.01-447.03z" />
</Grid>
</ControlTemplate>
</Button.Template>
</Button>
<Border Theme="{StaticResource CardBorder}" Width="320" Height="335" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="445,130,0,0">
<Grid>
<TextBlock HorizontalAlignment="Left" Margin="0,-20,0,0" TextWrapping="Wrap" Text="{Binding RemotePath1}" VerticalAlignment="Top"/>
<DataGrid HorizontalAlignment="Stretch"
IsEnabled="{Binding EnableFlag2}"
VerticalAlignment="Stretch"
IsReadOnly="True"
ItemsSource="{Binding RemoteTree}"
SelectedItem="{Binding RemoteTreeSelectedItem}"
RowHeight="30"
AutoGenerateColumns="False" GridLinesVisibility="None" >
<i:Interaction.Behaviors>
<!--<EventTriggerBehavior EventName="MouseDoubleClick">
<InvokeCommandAction Command="{Binding RemoteDoubleClickCommand}" CommandParameter="{Binding RemoteTreeSelectedItem}"/>
</EventTriggerBehavior>-->
</i:Interaction.Behaviors>
<DataGrid.Columns>
<DataGridTemplateColumn Header="名称" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Center" Height="20">
<Image Margin="2" HorizontalAlignment="Center" VerticalAlignment="Center" Tag="{Binding IsDirectory}">
<Image.Styles>
<Style Selector="Image[Tag=True]">
<Setter Property="Source" Value="/Assets/FTP/Folder.png" />
</Style>
<Style Selector="Image[Tag=False]">
<Setter Property="Source" Value="/Assets/FTP/File.png" />
</Style>
</Image.Styles>
</Image>
<TextBlock Text="{Binding Name}" Margin="2" HorizontalAlignment="Center" VerticalAlignment="Center" Tag="{Binding Path}"/>
</StackPanel >
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Border>
<Border Theme="{StaticResource CardBorder}" Width="755" Height="160" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10,460,0,0">
<Grid>
<TextBlock HorizontalAlignment="Center" Margin="0,-20,0,0" TextWrapping="Wrap" Text="日志信息" VerticalAlignment="Top"/>
<TextBox x:Name="TBInfo" TextWrapping="Wrap" ScrollViewer.VerticalScrollBarVisibility="Auto" Height="100" Text="{Binding Message}" Margin="10,10,10,10" HorizontalContentAlignment="Left" VerticalContentAlignment="Top">
<i:Interaction.Behaviors>
<DataTriggerBehavior Binding="{Binding Text.Length, ElementName=TBInfo}" ComparisonCondition="NotEqual" Value="0">
<ChangePropertyAction TargetObject="TBInfo" PropertyName="CaretIndex" Value="{Binding ElementName=TBInfo, Path=Text.Length}"/>
<CallMethodAction MethodName="ScrollToEnd" />
</DataTriggerBehavior>
</i:Interaction.Behaviors>
</TextBox>
</Grid>
</Border>
</Grid>
</UserControl>