字符串转义

万小萌 2007-01-16 09:57:22
我想用AJAX的SEND方法传一个XML字符串到PHP中,代码如下
var xmlFile='<?xml version="1.0" encoding="utf-8" ?><Config Domain="octon.cn" Orig="ppchat"></Config>';
xmlFile = "xmlFile=" + escape( xmlFile );
iConfigXmlHttpPostMessage.send(xmlFile);
但是到了php中就变成了:
<?xml version=\"1.0\" encoding=\"utf-8\" ?><Config Domain=\"octon.cn\" Orig=\"ppchat\"></Config>
怎么让PHP收到的字符串还是:'<?xml version="1.0" encoding="utf-8" ?><Config Domain="octon.cn" Orig="ppchat"></Config>'

各位大哥,大姐帮帮小弟吧,不胜感激!!
...全文
318 58 打赏 收藏 转发到动态 举报
写回复
用AI写文章
58 条回复
切换为时间正序
请发表友善的回复…
发表回复
万小萌 2007-11-24
  • 打赏
  • 举报
回复
关于让WPF软件界面支持全球化和本地化
周银辉
有朋友询问如何让WPF应用能够提供多语言支持(中文,英文,日文.....),我的建议是:(1)抛弃WinForm时代的资源存储方式 (2)利用WPF的动态资源特性.
下面简单介绍一下并打造一个简单的DEMO:

1,语言资源文件怎样存储
我们知道以前(WPF以前)我们将界面上的各国语言分别存储在.resx类型的文件中,然后利用ResourceManager来得到相应资源并根据当地的CultureInfo来给界面文本赋值.这是可行的.但在WPF中存在的一个问题是:我们必须为每个控件在后台代码中来Code这些逻辑,因为XAML是找不到.resx类型中的资源的.但WPF中绝大多数界面元素都是在XAML中定义的这是一件很麻烦的事情.所以我们应该抛弃这样的做法.
WPF中的资源继承了以前的多种存储形式,但可以在XAML和C#(或其他)中通行的有两中,一个是Content,一个是Resource,前者是"内容",既是松散的资源链接,后者是被编译并嵌入的资源,注意,你在设置资源文件属性的时候会发现还有一个很让人混淆的Embedded Resource,这也是内嵌的资源,但其被压缩为二进制形式,既和以前WinForm的内嵌资源相同,Resource和Embedded Resource在编码上的区别是前者可以通过Uri找到,这是XAML需要的方式,后者可以通过Stream找到,这可以通过编写c#代码来查找资源.
所以,在这里看来Content是我们保存语言资源的良好方式,由于其是松散的资源链接,所以为应用程序添加新的语言包时就可以不重新编译了,只需将对象的语言文件拷贝到指定的文件夹即可.

2,界面元素如何链接到语言文本
这是StaticResource 和 DynamicResource要做的事情,比如:
<Button Content="{DynamicResource OK}"/>至于是使用StaticResource 还是DynamicResource,这取决于你是否要在运行时动态切换,如果仅仅是软件启动的时候才切换语言StaticResource就可以了.

3,OK 实战一下:
3.1 新建项目,并在项目中新建一个Lang文件夹用于保存我们的语言文件

3.2 在Lang文件夹中,新建"ResourceDictionary(WPF)",命名为"DefaultLanguage.xaml",并将其BuildAction设置为Page,这是一个默认语言资源文件,其将被编译(而不是松散链接,这样可以确保在软件语言包丢失或没有某国家或地区的对应语言包时可以有一种默认的界面语言):我们这里采用英文作为默认语言:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib">

<sys:String x:Key="OK">
OK
</sys:String>

<sys:String x:Key="Cancel">
Cancel
</sys:String>

</ResourceDictionary>然后,我们添加另一国语言,比如中文,在Lang文件夹中,新建"ResourceDictionary(WPF)",命名为"zh-CN.xaml",并将其BuildAction设置为Content,将CopyToOutputDirctory设置为"if new",这样,我们的中文语言文件为将被拷贝到应用程序目录下的Lang目录下,其他的非默认语言的语言文件都应该采取这种方式.
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib">

<sys:String x:Key="OK">
确定
</sys:String>

<sys:String x:Key="Cancel">
取消
</sys:String>

</ResourceDictionary>
3.3 为了让编码人员在设计器(比如VS,Blend)中所见即所得地看到界面文本,我们应该将默认语言资源加入到应用程序的资源列表中:
<Application x:Class="LangDemo.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="Window1.xaml"
>

<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="lang\DefaultLanguage.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>

</Application>
这样我们就可以在设计器中使用这些资源了:

我们可以看到由于我们加载的默认语言是英文,设计器中我们的窗口界面上显示的是对应的英文文本.

3.4 软件启动时加载对应的本地化的语言:

public partial class App : Application
{

protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
LoadLanguage();
}

private void LoadLanguage()
{
CultureInfo currentCultureInfo = CultureInfo.CurrentCulture;

ResourceDictionary langRd = null;

try
{
langRd =
Application.LoadComponent(
new Uri(@"Lang\" + currentCultureInfo.Name + ".xaml", UriKind.Relative))
as ResourceDictionary;
}
catch
{
}

if (langRd != null)
{
if (this.Resources.MergedDictionaries.Count > 0)
{
this.Resources.MergedDictionaries.Clear();
}
this.Resources.MergedDictionaries.Add(langRd);
}


}
}

万小萌 2007-11-24
  • 打赏
  • 举报
回复
///////////////////////TestMainWindow.csproj//////////////
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{7F8E7C7B-D6FA-4EF6-971E-6730A29D5871}</ProjectGuid>
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<RootNamespace>TestMainWindow</RootNamespace>
<AssemblyName>TestMainWindow</AssemblyName>
<WarningLevel>4</WarningLevel>
<OutputType>winexe</OutputType>
<MinFrameworkVersionRequired>3.0</MinFrameworkVersionRequired>
<IsWebBootstrapper>true</IsWebBootstrapper>
<ManifestCertificateThumbprint>5420A55E10D3B71751F62D1710A8F2CBC4432283</ManifestCertificateThumbprint>
<ManifestKeyFile>TestMainWindow_TemporaryKey.pfx</ManifestKeyFile>
<GenerateManifests>false</GenerateManifests>
<SignManifests>false</SignManifests>
<SignAssembly>false</SignAssembly>
<AssemblyOriginatorKeyFile>
</AssemblyOriginatorKeyFile>
<TargetZone>Custom</TargetZone>
<ExcludedPermissions>
</ExcludedPermissions>
<PublishUrl>D:\_NET Projects\TestMainWindow\Publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Web</InstallFrom>
<UpdateEnabled>true</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<InstallUrl>http://localhost/TestMainWindow/</InstallUrl>
<SupportUrl>http://www.nLibrary.com</SupportUrl>
<TargetCulture>zh-CHS</TargetCulture>
<ProductName>妙思2008</ProductName>
<PublisherName>大连网信软件有限公司</PublisherName>
<CreateWebPageOnPublish>true</CreateWebPageOnPublish>
<WebPage>publish.htm</WebPage>
<DisallowUrlActivation>true</DisallowUrlActivation>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<ApplicationExtension>.application</ApplicationExtension>
<BootstrapperEnabled>false</BootstrapperEnabled>
<BootstrapperComponentsLocation>Relative</BootstrapperComponentsLocation>
<TargetFrameworkVersion>v3.0</TargetFrameworkVersion>
<FileUpgradeFlags>
</FileUpgradeFlags>
<UpgradeBackupLocation>
</UpgradeBackupLocation>
<OldToolsVersion>2.0</OldToolsVersion>
<ApplicationRevision>5</ApplicationRevision>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>.\bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugSymbols>false</DebugSymbols>
<Optimize>true</Optimize>
<OutputPath>.\bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
</PropertyGroup>
<ItemGroup>
<Reference Include="Draft.PresentationDesignMarkup, Version=0.0.4030.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<Reference Include="mscorlib" />
<Reference Include="PresentationDesignDeveloper, Version=0.0.4030.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\Cider\PresentationDesignDeveloper.DLL</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="WindowsBase" />
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
<Reference Include="UIAutomationProvider" />
<Reference Include="UIAutomationTypes" />
<Reference Include="ReachFramework" />
<Reference Include="System.Printing" />
<Reference Include="System.ServiceModel" />
<Reference Include="System.Runtime.Serialization" />
<Reference Include="System.IdentityModel" />
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Page Include="Main.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Compile Include="App.xaml.cs">
<DependentUpon>App.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="Main.xaml.cs">
<DependentUpon>Main.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<SubType>Designer</SubType>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<BaseApplicationManifest Include="Properties\app.manifest" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
<DependentUpon>Settings.settings</DependentUpon>
</Compile>
<AppDesigner Include="Properties\" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NcCalendar\NcCalendar.csproj">
<Project>{07C1063E-F5A4-4FA0-B3A8-99ED5C0E791A}</Project>
<Name>NcCalendar</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include="Microsoft.Data.Access.Components.2.8">
<Visible>False</Visible>
<ProductName>Microsoft Data Access Components 2.8</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
<Visible>False</Visible>
<ProductName>.NET Framework 2.0</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
<Visible>False</Visible>
<ProductName>Windows Installer 3.1</ProductName>
<Install>true</Install>
</BootstrapperPackage>
</ItemGroup>
<ItemGroup>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project>
万小萌 2007-11-24
  • 打赏
  • 举报
回复
//////////////////NcCalendar.csproj///////////////////////
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{07C1063E-F5A4-4FA0-B3A8-99ED5C0E791A}</ProjectGuid>
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<RootNamespace>NcCalendar</RootNamespace>
<AssemblyName>NcCalendar</AssemblyName>
<WarningLevel>4</WarningLevel>
<OutputType>library</OutputType>
<ApplicationVersion>1.0.0.*</ApplicationVersion>
<!-- Most people will use Publish dialog in Visual Studio to increment this -->
<MinFrameworkVersionRequired>3.0</MinFrameworkVersionRequired>
<SignAssembly>true</SignAssembly>
<AssemblyOriginatorKeyFile>
</AssemblyOriginatorKeyFile>
<TargetFrameworkVersion>v3.0</TargetFrameworkVersion>
<FileUpgradeFlags>
</FileUpgradeFlags>
<UpgradeBackupLocation>
</UpgradeBackupLocation>
<OldToolsVersion>2.0</OldToolsVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>.\bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugSymbols>false</DebugSymbols>
<Optimize>true</Optimize>
<OutputPath>.\bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
<Reference Include="WindowsBase" />
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
<Reference Include="UIAutomationProvider" />
<Reference Include="UIAutomationTypes" />
<Reference Include="ReachFramework" />
<Reference Include="System.Printing" />
<Reference Include="System.ServiceModel" />
<Reference Include="System.Runtime.Serialization" />
<Reference Include="System.IdentityModel" />
</ItemGroup>
<ItemGroup>
<Page Include="themes\generic.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
</ItemGroup>
<ItemGroup>
<Compile Include="NcCalendarControl.cs" />
<Compile Include="NcCalendar.cs" />
<Compile Include="NcCalendarDay.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
<DependentUpon>Settings.settings</DependentUpon>
</Compile>
<AppDesigner Include="Properties\" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project>
万小萌 2007-11-24
  • 打赏
  • 举报
回复
///////////////////Main.xaml///////////////////////
<Window x:Class="TestMainWindow.Main"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TestMainWindow" Height="400" Width="600" xmlns:my="clr-namespace:System;assembly=mscorlib" ResizeMode="CanResizeWithGrip"
xmlns:local="clr-namespace:TestMainWindow;assembly=NcTabControl"
xmlns:l="clr-namespace:TestMainWindow;assembly=NcCalendar"
xmlns:s="clr-namespace:System;assembly=mscorlib"

>
<Window.Resources>
</Window.Resources>
<Grid Name="mainWindow">
<Grid.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,0">
<GradientStop Offset="0" Color="#FFE5E5D7" />
<GradientStop Offset="1" Color="#FFF3F2E7" />
</LinearGradientBrush>
</Grid.Background>

<Grid.RowDefinitions>
<RowDefinition Name="MainMenu" Height="25"/>
<RowDefinition Name="MainArea" Height="*"/>
<RowDefinition Name="MainStatus" Height="25" />
</Grid.RowDefinitions>

<Grid Grid.Row="1" MinHeight="50" MinWidth="50" Name="grid1" >
<Grid.ColumnDefinitions>
<ColumnDefinition Name="navagateFrame" Width="2*" MinWidth="100" />
<ColumnDefinition Name="splitterLeft" Width="3" />
<ColumnDefinition Name="mainFrame" Width="5*" MinWidth="100" />
<ColumnDefinition Name="splitterRight" Width="3" />
<ColumnDefinition Name="commandFrame" Width="2*" MinWidth ="100" />
</Grid.ColumnDefinitions>
<GridSplitter Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" Name="gridSplitterLeft" Grid.Column="1" Width="4" HorizontalAlignment="Center" VerticalAlignment="Stretch" Focusable="False"/>
<GridSplitter Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" Name="gridSplitterRight" Grid.Column="3" Width="4" HorizontalAlignment="Center" VerticalAlignment="Stretch" Focusable="False"/>
<Border ClipToBounds="True" SnapsToDevicePixels="True" Grid.Column="2" BorderThickness="1" BorderBrush="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}">
<TabControl TabStripPlacement="Top" SnapsToDevicePixels="True" Name="DocumentContainer" BorderBrush="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}">

<TabItem Header="这是起始页">
<StackPanel Name ="stack1">
<l:NcCalendarControl Name="nvCal"/>
<TextBlock Name="curSelectedDay" Text="{Binding ElementName=nvCal,Path=CurrentDay}"/>
<ContentPresenter Content="{x:Static s:DateTime.Now}"/>
</StackPanel>
</TabItem>
<TabItem Header="这是第二页">
<StackPanel Name="stack2">
</StackPanel>
</TabItem>
</TabControl>
</Border>
</Grid>

</Grid>
</Window>
万小萌 2007-11-24
  • 打赏
  • 举报
回复

</Style>
</Border.Style>
</Border>
<Border Grid.Row="2" BorderThickness="1,1,0,0" BorderBrush="{DynamicResource {x:Static SystemColors.ControlBrushKey}}">
<ItemsControl Focusable="False" ItemsSource="{TemplateBinding Items}" ItemTemplate="{StaticResource ncCalendarWeekTemplate}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</Border>
<Border Grid.Row="3" BorderThickness="0,0,1,1" BorderBrush="{DynamicResource {x:Static SystemColors.ControlBrushKey}}">
<Grid Background="SlateGray">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*" MinWidth="6"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Button Margin="4,1,4,1" Grid.Column="0" Focusable="False" Content="今天" ToolTip="转到今天" Command="{x:Static local:NcCalendarControl.Today}" VerticalAlignment="Center" HorizontalAlignment="Center"></Button>
<ContentPresenter Grid.Column="1" Content="{x:Static sys:DateTime.Now}" VerticalAlignment="Center" ContentTemplate="{StaticResource ncCalendarDayDateShowTemplate}"/>
<ContentPresenter Grid.Column="3" Content="{TemplateBinding CurrentDay}" VerticalAlignment="Center" ContentTemplate="{StaticResource ncCalendarDayDateShowTemplate}"/>
</Grid>
</Border>
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="Changeable" Value ="false">
<Setter TargetName="btnPrvYear" Property ="Visibility" Value ="Collapsed"/>
<Setter TargetName="btnPrvMonth" Property ="Visibility" Value ="Collapsed"/>
<Setter TargetName="btnNextYear" Property ="Visibility" Value ="Collapsed"/>
<Setter TargetName="btnNextMonth" Property ="Visibility" Value ="Collapsed"/>
</Trigger>
<Trigger Property="ShowHeader" Value ="false">
<Setter TargetName="bdHeader" Property ="Visibility" Value ="Collapsed"/>
</Trigger>
<Trigger Property="ShowWeekTitle" Value ="false">
<Setter TargetName="bdWeekTitle" Property ="Visibility" Value ="Collapsed"/>
</Trigger>


</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
万小萌 2007-11-24
  • 打赏
  • 举报
回复
<DataTrigger Binding="{Binding Path=Month}" Value="9">
<Setter Property="Background" Value="#FFCDACE7"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Month}" Value="10">
<Setter Property="Background" Value="#FFFFAE54"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Month}" Value="11">
<Setter Property="Background" Value="#FFADA67C"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Month}" Value="12">
<Setter Property="Background" Value="#FF05AC05"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Month}" Value="13">
<Setter Property="Background" Value="#FFF0F0F0"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
</Border>
<Border Name="bdWeekTitle" DataContext="{TemplateBinding Items}" Grid.Row="1" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="1*"/>
</Grid.ColumnDefinitions>
<TextBlock Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center" Text="日" Grid.Column="0"/>
<TextBlock Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center" Text="一" Grid.Column="1"/>
<TextBlock Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center" Text="二" Grid.Column="2"/>
<TextBlock Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center" Text="三" Grid.Column="3"/>
<TextBlock Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center" Text="四" Grid.Column="4"/>
<TextBlock Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center" Text="五" Grid.Column="5"/>
<TextBlock Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center" Text="六" Grid.Column="6"/>
</Grid>
<Border.Style>
<Style TargetType="Border" x:Name="bdWeekName">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Month}" Value="1">
<Setter Property="Background" Value="#FF509BEF"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Month}" Value="2">
<Setter Property="Background" Value="#FFA5D610"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Month}" Value="3">
<Setter Property="Background" Value="#FF05AC05"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Month}" Value="4">
<Setter Property="Background" Value="#FFDEB511"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Month}" Value="5">
<Setter Property="Background" Value="#FF6F076F"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Month}" Value="6">
<Setter Property="Background" Value="#FF298CBD"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Month}" Value="7">
<Setter Property="Background" Value="#FF383883"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Month}" Value="8">
<Setter Property="Background" Value="#FFC51111"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Month}" Value="9">
<Setter Property="Background" Value="#FFB58CDE"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Month}" Value="10">
<Setter Property="Background" Value="#FFFF8402"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Month}" Value="11">
<Setter Property="Background" Value="#FF9C9463"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Month}" Value="12">
<Setter Property="Background" Value="#FF008500"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Month}" Value="13">
<Setter Property="Background" Value="#FF0F0F0F"></Setter>
</DataTrigger>
</Style.Triggers>
万小萌 2007-11-24
  • 打赏
  • 举报
回复


</Style.Resources>
<Setter Property="Width" Value="Auto"/>
<Setter Property="Height" Value="Auto"/>
<Setter Property="FocusVisualStyle" Value="{x:Null}"></Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:NcCalendarControl}">
<Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
<Grid Width="Auto" MinWidth="168" Height="Auto" MinHeight="100">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Border Name="bdHeader" DataContext="{TemplateBinding Items}" Grid.Row="0" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
<Grid Margin="3,3,3,3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.5*"/>
<ColumnDefinition Width="0.5*"/>
</Grid.ColumnDefinitions>
<StackPanel Orientation="Horizontal" Grid.Column="0" HorizontalAlignment="Left">
<RepeatButton x:Name="btnPrvMonth" Content ="‹" Command="{x:Static local:NcCalendarControl.PreviousMonth}" BorderThickness ="0"/>
<TextBlock FontFamily="Arial" Margin="3,0,3,0" Foreground="White" TextAlignment="Right" VerticalAlignment="Center" Text="{Binding Path=Month}" MinWidth ="16"/>
<TextBlock FontFamily="Arial" Margin="3,0,1,0" Foreground="White" TextAlignment="Center" VerticalAlignment="Center" Text="月"/>
<RepeatButton x:Name="btnNextMonth" Content =" ›" Command="{x:Static local:NcCalendarControl.NextMonth}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Grid.Column="2" HorizontalAlignment="Right">
<RepeatButton x:Name="btnPrvYear" Content ="‹‹" Command="{x:Static local:NcCalendarControl.PreviousYear}"/>
<TextBlock FontFamily="Arial" Margin="5,0,5,0" Foreground="White" VerticalAlignment="Center" Text="{Binding Path=Year}"/>
<RepeatButton x:Name="btnNextYear" Content ="››" Command="{x:Static local:NcCalendarControl.NextYear}"/>
</StackPanel>
</Grid>
<Border.Style>
<Style TargetType="Border" x:Name="bdHeader">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Month}" Value="1">
<Setter Property="Background" Value="#FF73B5F7"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Month}" Value="2">
<Setter Property="Background" Value="#FFCFF765"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Month}" Value="3">
<Setter Property="Background" Value="#FF0FD60F"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Month}" Value="4">
<Setter Property="Background" Value="#FFF7D64A"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Month}" Value="5">
<Setter Property="Background" Value="#FF9C079C"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Month}" Value="6">
<Setter Property="Background" Value="#FF53ADD6"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Month}" Value="7">
<Setter Property="Background" Value="#FF5252BD"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Month}" Value="8">
<Setter Property="Background" Value="#FFF00F0F"></Setter>
</DataTrigger>
万小萌 2007-11-24
  • 打赏
  • 举报
回复
////////////////////////////////generic.xaml////////////////////////////////////
<?xml version="1.0" encoding="utf-8"?>
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:local="clr-namespace:TestMainWindow"
>

<DataTemplate x:Key="ncCalendarDayTemplate" DataType="{x:Type local:NcCalendarDay}">
<DataTemplate.Resources>
<Style TargetType="ToggleButton">
<Setter Property="Background" Value="White"/>
<Setter Property="MinHeight" Value="20"/>
<Setter Property="MinWidth" Value="24"/>
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate TargetType="ToggleButton">
<Border BorderThickness="{TemplateBinding BorderThickness}" BorderBrush ="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}">
<ContentPresenter Content="{TemplateBinding Content}" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</DataTemplate.Resources>
<ToggleButton Name ="btnDay" BorderThickness="0,0,1,1" BorderBrush ="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" IsChecked="{Binding Path=IsCurrent,Mode=TwoWay}" Content="{Binding Path=Day}" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" TextBlock.TextAlignment="Center"/>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=DayOfWeek}" Value="0">
<Setter TargetName="btnDay" Property="Background" Value="Orange"/>
<Setter TargetName="btnDay" Property="Foreground" Value="White"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=DayOfWeek}" Value="6">
<Setter TargetName="btnDay" Property="Background" Value="SteelBlue"/>
<Setter TargetName="btnDay" Property="Foreground" Value="White"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=IsNextMonth}" Value="True">
<Setter TargetName="btnDay" Property="Foreground" Value="LightGray"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=IsPreviousMonth}" Value="True">
<Setter TargetName="btnDay" Property="Foreground" Value="LightGray"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=IsToday}" Value="True">
<Setter TargetName="btnDay" Property="Background" Value="Blue"/>
<Setter TargetName="btnDay" Property="Foreground" Value="White"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=IsCurrent}" Value="True">
<Setter TargetName="btnDay" Property="Background" Value="DarkGreen"/>
<Setter TargetName="btnDay" Property="Foreground" Value="White"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>



<DataTemplate x:Key="ncCalendarWeekTemplate" DataType="{x:Type local:NcCalendarWeek}">
<Border Focusable="False" Background="{DynamicResource {x:Static SystemColors.ControlLightBrushKey}}" Margin="0,0,0,0" BorderThickness="0" >
<Grid Focusable="False">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*" MinWidth="24"/>
<ColumnDefinition Width="1*" MinWidth="24"/>
<ColumnDefinition Width="1*" MinWidth="24"/>
<ColumnDefinition Width="1*" MinWidth="24"/>
<ColumnDefinition Width="1*" MinWidth="24"/>
<ColumnDefinition Width="1*" MinWidth="24"/>
<ColumnDefinition Width="1*" MinWidth="24"/>
</Grid.ColumnDefinitions>
<ContentPresenter x:Name="btSunday" Grid.Column="0" Content="{Binding [0]}" ContentTemplate="{StaticResource ncCalendarDayTemplate}"/>
<ContentPresenter x:Name="btMonday" Grid.Column="1" Content="{Binding [1]}" ContentTemplate="{StaticResource ncCalendarDayTemplate}"/>
<ContentPresenter x:Name="btTuesday" Grid.Column="2" Content="{Binding [2]}" ContentTemplate="{StaticResource ncCalendarDayTemplate}"/>
<ContentPresenter x:Name="btWednesday" Grid.Column="3" Content="{Binding [3]}" ContentTemplate="{StaticResource ncCalendarDayTemplate}"/>
<ContentPresenter x:Name="btThursday" Grid.Column="4" Content="{Binding [4]}" ContentTemplate="{StaticResource ncCalendarDayTemplate}"/>
<ContentPresenter x:Name="btFriday" Grid.Column="5" Content="{Binding [5]}" ContentTemplate="{StaticResource ncCalendarDayTemplate}"/>
<ContentPresenter x:Name="btSaturday" Grid.Column="6" Content="{Binding [6]}" ContentTemplate="{StaticResource ncCalendarDayTemplate}"/>
</Grid>
</Border>
</DataTemplate>

<Style TargetType="{x:Type local:NcCalendarControl}">
<Style.Resources>
<Style TargetType="RepeatButton">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="Focusable" Value="False"/>
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate TargetType="RepeatButton">
<Border Background="{TemplateBinding Background}" SnapsToDevicePixels="True" >
<ContentPresenter Content="{TemplateBinding Content}" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<DataTemplate x:Key="ncCalendarDayDateShowTemplate" DataType="{x:Type sys:DateTime}">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock Foreground="White" Text="{Binding Path=Year}"/>
<TextBlock Foreground="White" Text="年"/>
<TextBlock Foreground="White" Text="{Binding Path=Month}"/>
<TextBlock Foreground="White" Text="月"/>
<TextBlock Foreground="White" Text="{Binding Path=Day}"/>
<TextBlock Foreground="White" Text="日"/>
</StackPanel>
</DataTemplate>
万小萌 2007-11-24
  • 打赏
  • 举报
回复
///////////////////////////NcCalendarDay.cs////////////////////
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Globalization;
using System.Windows;
using System.Windows.Input;

namespace TestMainWindow
{
public class NcCalendarDay:INotifyPropertyChanged
{
public static readonly NcCalendarDay Empty = new NcCalendarDay();
private DateTime mValue = new DateTime(1, 1, 1);
private NcCalendar mOwner;
private NcCalendarDay(){}
private bool mIsPreviousMonth = false;
private bool mIsNextMonth = false;

public NcCalendarDay(DateTime oneDay)
{
mValue = oneDay;
}

public DateTime Value
{
get { return mValue; }
}
static NcCalendarDay()
{
CommandManager.RegisterClassCommandBinding(typeof(NcCalendarDay), new CommandBinding(Select, OnSelect));
}

#region Select
/// <summary>
/// 选择当前日期。
/// </summary>
public static RoutedUICommand Select { get { return mSelect; } }
private static RoutedUICommand mSelect = new RoutedUICommand("Select", "Select", typeof(NcCalendarDay));

private static void OnSelect(object sender, ExecutedRoutedEventArgs e)
{
Console.WriteLine("====");
NcCalendarDay control = sender as NcCalendarDay;
control.IsCurrent = true;
if (control == null) return;
// 命令实现代码
}
#endregion


public int DayOfWeek { get { return (this.IsEmpty ? -1 : (int)mValue.DayOfWeek); } }

public int Year { get { return (this.IsEmpty ? 0 : mValue.Year); } }

public int Month { get { return (this.IsEmpty ? 0 : mValue.Month); } }

public int Day { get { return (this.IsEmpty ? 0 : mValue.Day); } }

public bool IsEmpty { get { return (this == NcCalendarDay.Empty); } }

public bool IsToday { get { return mValue.Date == DateTime.Now.Date; } }

public int WeekOfMonth
{
get
{
DateTime firstDay = new DateTime(mValue.Year, mValue.Month, 1);
int emptyDays = (int)firstDay.DayOfWeek;
return (int)Math.Ceiling((mValue.Day + emptyDays)/7f);
}
}

public bool IsCurrent
{
get { return (mOwner != null && mOwner.Current == this); }
set
{
if (mOwner == null) return;
if (mOwner.Current == this) return;
if (value)
{
NcCalendarDay oldCurrent = mOwner.Current;
mOwner.Current = this;
OnPropertyChanged("IsCurrent");
if (oldCurrent != null) oldCurrent.OnPropertyChanged("IsCurrent");
}
}
}

public NcCalendar Owner
{
get { return mOwner; }
internal set { this.mOwner = value; }
}

public bool IsPreviousMonth
{
get { return mIsPreviousMonth; }
internal set { mIsPreviousMonth = value; }
}
public bool IsNextMonth
{
get { return mIsNextMonth; }
internal set { mIsNextMonth = value; }
}


#region INotifyPropertyChanged 成员

public event PropertyChangedEventHandler PropertyChanged;

/// <summary>
/// 引发属性改变事件。
/// </summary>
/// <param name="propertyName">属性名称。</param>
public void OnPropertyChanged(string propertyName)
{
PropertyChangedEventArgs args = new PropertyChangedEventArgs(propertyName);
this.OnPropertyChanged(args);
}
/// <summary>
/// 引发属性改变事件。
/// </summary>
/// <param name="e">事件参数。</param>
protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (this.PropertyChanged != null) this.PropertyChanged(this, e);
}
#endregion
}
}

万小萌 2007-11-24
  • 打赏
  • 举报
回复
#region 命令定义
#region PreviousYear
/// <summary>
/// 月历视图向前移动一年命令。
/// </summary>
public static RoutedUICommand PreviousYear { get { return mPreviousYear; } }
private static RoutedUICommand mPreviousYear = new RoutedUICommand("PreviousYear", "PreviousYear", typeof(NcCalendarControl));

private static void OnPreviousYear(object sender, ExecutedRoutedEventArgs e)
{
NcCalendarControl calendar = sender as NcCalendarControl;
if (calendar == null) return;
calendar.Items.PreviousYear();
}
#endregion
#region NextYear
/// <summary>
/// 月历视图向后移动一年命令。
/// </summary>
public static RoutedUICommand NextYear { get { return mNextYear; } }
private static RoutedUICommand mNextYear = new RoutedUICommand("NextYear", "NextYear", typeof(NcCalendarControl));

private static void OnNextYear(object sender, ExecutedRoutedEventArgs e)
{
NcCalendarControl calendar = sender as NcCalendarControl;
if (calendar == null) return;
calendar.Items.NextYear();
}
#endregion
#region PreviousMonth
/// <summary>
/// 月历视图向前移动一月命令。
/// </summary>
public static RoutedUICommand PreviousMonth { get { return mPreviousMonth; } }
private static RoutedUICommand mPreviousMonth = new RoutedUICommand("PreviousMonth", "PreviousMonth", typeof(NcCalendarControl));

private static void OnPreviousMonth(object sender, ExecutedRoutedEventArgs e)
{
NcCalendarControl calendar = sender as NcCalendarControl;
if (calendar == null) return;
calendar.Items.PreviousMonth();
}
#endregion
#region NextMonth
/// <summary>
/// 月历视图向后移动一月命令。
/// </summary>
public static RoutedUICommand NextMonth { get { return mNextMonth; } }
private static RoutedUICommand mNextMonth = new RoutedUICommand("NextMonth", "NextMonth", typeof(NcCalendarControl));

private static void OnNextMonth(object sender, ExecutedRoutedEventArgs e)
{
NcCalendarControl calendar = sender as NcCalendarControl;
if (calendar == null) return;
calendar.Items.NextMonth();
}
#endregion
#region Today
/// <summary>
/// 转到今天命令。
/// </summary>
public static RoutedUICommand Today { get { return mToday; } }
private static RoutedUICommand mToday = new RoutedUICommand("Today", "Today", typeof(NcCalendarControl));
private static void OnToday(object sender, ExecutedRoutedEventArgs e)
{
NcCalendarControl calendar = sender as NcCalendarControl;
if (calendar == null) return;
calendar.Items.Today();
DateTime dt = calendar.CurrentDay.Date;
// 依赖于XAML中的控件,需要改进 ??????????????????????????
List<RadioButton> rbList = new List<RadioButton>();
calendar.FindRadioButton(calendar, rbList);
foreach(RadioButton one in rbList )
{
NcCalendarDay day = one.DataContext as NcCalendarDay;
if (day != null && day.Value.Date == dt.Date)
{
one.Focus();
break;
}
}
}
/// <summary>
/// 查找视图中的“天”按钮。
/// </summary>
/// <param name="parent"></param>
/// <param name="rbList"></param>
private void FindRadioButton(DependencyObject parent, List<RadioButton> rbList)
{
int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < childrenCount; i++)
{
DependencyObject obj = VisualTreeHelper.GetChild(parent, i);
if (obj.GetType() == typeof(RadioButton))
{
RadioButton rb = obj as RadioButton;
if (rb != null) rbList.Add(rb);

//NcCalendarDay day = rb.Content as NcCalendarDay;
//if (day != null && day.Value.Date == dt.Date)
//{
// rb.Focus();
// break;
//}
}
else
FindRadioButton(obj, rbList);
}

}
#endregion
#endregion

/// <summary>
/// 设置控件的当前日期。如果日期不在当前显示的月份,当前日历视图将变为指定日期所在的月份视图。
/// </summary>
/// <param name="date">日期。</param>
public void SetValue(DateTime date) { if (date != null) Items.SetValue(date); }

/// <summary>
/// 选项改变事件。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Items_SelectedChanged(object sender, EventArgs e)
{
if (Items.Current == null || Items.Current == NcCalendarDay.Empty) return;
DateTime dt = Items.Current.Value;
this.SetValue(NcCalendarControl.CurrentDayPropertyKey, dt);
RaiseSelectedChangedEvent();
}
}
}
万小萌 2007-11-24
  • 打赏
  • 举报
回复
////////////////NcCalendarControl.cs///////////////////////
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace TestMainWindow
{
public class NcCalendarControl : Control
{
#region 构造函数
static NcCalendarControl()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(NcCalendarControl), new FrameworkPropertyMetadata(typeof(NcCalendarControl)));
CommandManager.RegisterClassCommandBinding(typeof(NcCalendarControl), new CommandBinding(PreviousYear, OnPreviousYear));
CommandManager.RegisterClassCommandBinding(typeof(NcCalendarControl), new CommandBinding(PreviousMonth, OnPreviousMonth));
CommandManager.RegisterClassCommandBinding(typeof(NcCalendarControl), new CommandBinding(NextYear, OnNextYear));
CommandManager.RegisterClassCommandBinding(typeof(NcCalendarControl), new CommandBinding(NextMonth, OnNextMonth));
CommandManager.RegisterClassCommandBinding(typeof(NcCalendarControl), new CommandBinding(Today, OnToday));
}
public NcCalendarControl()
{
this.SetValue(ItemsProperty, new NcCalendar(DateTime.Now));
Items.SelectedChanged += new EventHandler(Items_SelectedChanged);
}
#endregion

#region 属性定义
/// <summary>
/// 本月的"周"集合
/// </summary>
public NcCalendar Items
{
get { return (NcCalendar)GetValue(ItemsProperty); }
set { SetValue(ItemsProperty, value); }
}
public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register("Items", typeof(NcCalendar), typeof(NcCalendarControl), new UIPropertyMetadata(new NcCalendar(DateTime.Now)));

#region Changeable
/// <summary>
/// 是否能够通过按钮改变年、月。
/// </summary>
public static readonly DependencyProperty ChangeableProperty = DependencyProperty.Register("Changeable", typeof(bool), typeof(NcCalendarControl), new FrameworkPropertyMetadata(true));
/// <summary>
/// 获取或设置Changeable
/// </summary>
public bool Changeable
{
get { return (bool)base.GetValue(NcCalendarControl.ChangeableProperty); }
set { base.SetValue(NcCalendarControl.ChangeableProperty, value); }
}
#endregion

#region ShowHeader
/// <summary>
/// 是否显示月历头。
/// </summary>
public static readonly DependencyProperty ShowHeaderProperty = DependencyProperty.Register("ShowHeader", typeof(bool), typeof(NcCalendarControl), new FrameworkPropertyMetadata(true));
/// <summary>
/// 获取或设置ShowHeader
/// </summary>
public bool ShowHeader
{
get { return (bool)base.GetValue(NcCalendarControl.ShowHeaderProperty); }
set { base.SetValue(NcCalendarControl.ShowHeaderProperty, value); }
}
#endregion

#region ShowWeekTitle
/// <summary>
/// 是否显示周标签。
/// </summary>
public static readonly DependencyProperty ShowWeekTitleProperty = DependencyProperty.Register("ShowWeekTitle", typeof(bool), typeof(NcCalendarControl), new FrameworkPropertyMetadata(true));
/// <summary>
/// 获取或设置ShowWeekTitle
/// </summary>
public bool ShowWeekTitle
{
get { return (bool)base.GetValue(NcCalendarControl.ShowWeekTitleProperty); }
set { base.SetValue(NcCalendarControl.ShowWeekTitleProperty, value); }
}
#endregion

#region CurrentDay
/// <summary>
/// 获取CurrentDay标识
/// </summary>
public static readonly DependencyPropertyKey CurrentDayPropertyKey = DependencyProperty.RegisterReadOnly("CurrentDay", typeof(DateTime), typeof(NcCalendarControl), new FrameworkPropertyMetadata(DateTime.Now.Date));
/// <summary>
/// 获取CurrentDay属性
/// </summary>
public static readonly DependencyProperty CurrentDayProperty = CurrentDayPropertyKey.DependencyProperty;
/// <summary>
/// 获取CurrentDay
/// </summary>
public DateTime CurrentDay { get { return (DateTime)base.GetValue(NcCalendarControl.CurrentDayProperty); } }
#endregion
#endregion

#region 事件定义
/// <summary>
/// 选项改变事件。
/// </summary>
public static readonly RoutedEvent SelectedChangedEvent = EventManager.RegisterRoutedEvent("SelectedChanged", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(NcCalendarControl));
public event RoutedEventHandler SelectedChanged
{
add { AddHandler(SelectedChangedEvent, value); }
remove { RemoveHandler(SelectedChangedEvent, value); }
}
void RaiseSelectedChangedEvent()
{
RoutedEventArgs args = new RoutedEventArgs(SelectedChangedEvent,this);
RaiseEvent(args);
}
#endregion
万小萌 2007-11-24
  • 打赏
  • 举报
回复
/// <summary>
/// 转到今天
/// </summary>
public void Today() { BuildCalendar(DateTime.Now.Date); }
/// <summary>
/// 设置“当前日”
/// </summary>
/// <param name="day"></param>
/// <returns></returns>
private bool setDay(int day)
{
foreach (NcCalendarWeek week in this)
{
foreach (NcCalendarDay one in week)
{
if (!one.IsEmpty && one.Day == day)
{
if (mCurrent != null) mCurrent.IsCurrent = false;
mCurrent = one;
OnPropertyChanged(new PropertyChangedEventArgs("Current"));
OnPropertyChanged(new PropertyChangedEventArgs("Day"));
one.OnPropertyChanged("IsCurrent");
this.OnSelectedChanged(new EventArgs());
return true;
}
else
{
mCurrent = null;
this.OnPropertyChanged(new PropertyChangedEventArgs("IsCurrent"));
}
}
}
return false;
}

private bool BuildCalendar(DateTime date) { if (date != null) return BuildCalendar(date.Year, date.Month, date.Day); return false; }
/// <summary>
/// 创建月历视图数据
/// </summary>
/// <param name="year"></param>
/// <param name="month"></param>
/// <param name="day"></param>
/// <returns></returns>
private bool BuildCalendar(int year, int month, int day)
{
if (mCurrent != null)
{
// 年、月、日均没有变化,不作任何改变
if (year == mCurrent.Year && month == mCurrent.Month && day == mCurrent.Day) return true;
// 年、月没有变化,不需要重建日期列表,定位当前日期
if (year == mCurrent.Year && month == mCurrent.Month) return setDay(day);
}

DateTime minDate = CultureInfo.CurrentCulture.Calendar.MinSupportedDateTime.Date;
DateTime maxDate = CultureInfo.CurrentCulture.Calendar.MaxSupportedDateTime.Date;
int maxMonthOfYear = CultureInfo.CurrentCulture.Calendar.GetMonthsInYear(year);


// 方案1:年月日不符合范围限定时,返回False
if (year < minDate.Year || year > maxDate.Year || month < 1 || month > maxMonthOfYear) return false;

// 方案2:年月日不符合范围限定时,规范到合理范围内
//if (year < minDate.Year) year = minDate.Year;
//if (year > maxDate.Year) year = maxDate.Year;
//if (month < 1) month = 1;
//if (month > maxMonthOfYear) month = maxMonthOfYear;


DateTime firstDay = new DateTime(year, month, 1);
int emptyDays = (int)firstDay.DayOfWeek;

int days = CultureInfo.CurrentCulture.Calendar.GetDaysInMonth(year, month);
int weeks = (int)Math.Ceiling(((float)days) / 7);

if (day < 1 || day > days) day = (mCurrent != null) ? mCurrent.Day : 1;

this.Clear();

int dayOfWeekCount = 0;
int weekCount = 0;
NcCalendarWeek week = new NcCalendarWeek();
NcCalendarDay item = NcCalendarDay.Empty;
if (emptyDays > 0)
{
for (int i = emptyDays; i > 0; i--)
{
item = new NcCalendarDay(firstDay.AddDays(-i));
item.Owner = this;
item.IsPreviousMonth = true;
week.Add(item); //添加"上个月"的日期
dayOfWeekCount++;
}
}

NcCalendarDay currentDayTo = null;
for (int i = 1; i <= days; i++)
{
item = new NcCalendarDay(new DateTime(year, month, i));
item.Owner = this;
week.Add(item);
dayOfWeekCount++;
if (dayOfWeekCount >= 7)
{
dayOfWeekCount = 0;
weekCount++;
this.Add(week);
week = new NcCalendarWeek();
}
if (i == day) currentDayTo = item;
}


firstDay = item.Value.Date; // 借用firstDay变量
if (dayOfWeekCount > 0)
{
for (int i = dayOfWeekCount; i < 7; i++)
{
item = new NcCalendarDay(firstDay.AddDays(i - dayOfWeekCount + 1));
item.IsNextMonth = true;
item.Owner = this;
week.Add(item); //添加"下个月"的日期
}
if (dayOfWeekCount < 7) this.Add(week);
}

//if (this.mCurrent == null || this.mCurrent != currentDayTo)
if (this.mCurrent == null)
{
this.mCurrent = currentDayTo;
this.OnSelectedChanged(new EventArgs());
}

mYear = year;
mMonth = month;

OnPropertyChanged(new PropertyChangedEventArgs("Day"));
OnPropertyChanged(new PropertyChangedEventArgs("Month"));
OnPropertyChanged(new PropertyChangedEventArgs("Year"));

return true;
}
#endregion

protected internal virtual void OnSelectedChanged(EventArgs e) { if (this.SelectedChanged != null) this.SelectedChanged(this, e); }
protected internal virtual void OnCurrentChanged(EventArgs e) { if (this.CurrentChanged != null) this.CurrentChanged(this, e); }
}
public class NcCalendarWeek : ObservableCollection<NcCalendarDay>, INotifyPropertyChanged { }

}
万小萌 2007-11-24
  • 打赏
  • 举报
回复
//////////////////NcCalendar.cs//////////////////////
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Globalization;
using System.Collections.ObjectModel;

namespace TestMainWindow
{
public class NcCalendar : ObservableCollection<NcCalendarWeek>, INotifyPropertyChanged
{
#region 字段定义
private int mYear;
private int mMonth;
private NcCalendarDay mCurrent = NcCalendarDay.Empty;

#endregion
#region 事件定义
public event EventHandler SelectedChanged;
public event EventHandler CurrentChanged;
#endregion
#region 构造函数
public NcCalendar() : this(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day) { }
public NcCalendar(DateTime date) : this(date.Year, date.Month, date.Day) { }
public NcCalendar(int year, int month) : this(year, month, 1) { }
public NcCalendar(int year, int month, int day) { BuildCalendar(year, month, day); }
#endregion
#region 属性定义
public int Year
{
get { return mYear; }
set
{
int day = (mCurrent != null) ? day = mCurrent.Day : 1;
if (BuildCalendar(value, mMonth, day)) OnPropertyChanged(new PropertyChangedEventArgs("Year"));
}
}
public int Month
{
get { return mMonth; }
set
{
int day = (mCurrent != null) ? day = mCurrent.Day : 1;
if (BuildCalendar(mYear, value, day)) OnPropertyChanged(new PropertyChangedEventArgs("Month"));
}
}
public int Day
{
get { return mCurrent.Day; }
set { if (BuildCalendar(mYear, mMonth, value)) OnPropertyChanged(new PropertyChangedEventArgs("Day")); }
}

public NcCalendarDay Current
{
get { return mCurrent; }
set
{
if (value == null || value == NcCalendarDay.Empty || value == mCurrent || value.Value.Date == mCurrent.Value.Date) return;
bool setOK = false;
foreach (NcCalendarWeek week in this)
{
foreach (NcCalendarDay one in week)
{
if (one.IsEmpty) continue;
if (one.Value.Date == value.Value.Date)
{
mCurrent = one;
setOK = true;
OnPropertyChanged(new PropertyChangedEventArgs("Day"));
this.OnSelectedChanged(new EventArgs());
break;
}
}
if (setOK) break;
}
}
}
#endregion

#region 方法定义
public void SetValue(DateTime date) { BuildCalendar(date); }
/// <summary>
/// 向后一年
/// </summary>
public void NextYear()
{
if (mCurrent.Year == mYear && mCurrent.Month == mMonth)
{
BuildCalendar(mCurrent.Value.AddYears(1));
return;
}

int newYear = mYear + 1;
int newMonth = mMonth;
int newDay = (mCurrent==null || mCurrent == NcCalendarDay.Empty) ? DateTime.Now.Day : mCurrent.Value.Day;

DateTime maxDate = CultureInfo.CurrentCulture.Calendar.MaxSupportedDateTime.Date;
if (newYear > maxDate.Year) return;

int maxMonthOfYear = CultureInfo.CurrentCulture.Calendar.GetMonthsInYear(newYear);
if (newMonth > maxMonthOfYear) newMonth = maxMonthOfYear;
int maxDayOfMonth = CultureInfo.CurrentCulture.Calendar.GetDaysInMonth(newYear, newMonth);
if (newDay > maxDayOfMonth) newDay = maxDayOfMonth;

BuildCalendar(newYear, newMonth, newDay);
}
/// <summary>
/// 向前一年
/// </summary>
public void PreviousYear()
{
if (mCurrent.Year == mYear && mCurrent.Month == mMonth)
{
BuildCalendar(mCurrent.Value.AddYears(-1));
return;
}

int newYear = mYear - 1;
int newMonth = mMonth;
int newDay = (mCurrent == null || mCurrent == NcCalendarDay.Empty) ? DateTime.Now.Day : mCurrent.Value.Day;

DateTime minDate = CultureInfo.CurrentCulture.Calendar.MinSupportedDateTime.Date;
if (newYear < minDate.Year) return;

int maxMonthOfYear = CultureInfo.CurrentCulture.Calendar.GetMonthsInYear(newYear);
if (newMonth > maxMonthOfYear) newMonth = maxMonthOfYear;
int maxDayOfMonth = CultureInfo.CurrentCulture.Calendar.GetDaysInMonth(newYear, newMonth);
if (newDay > maxDayOfMonth) newDay = maxDayOfMonth;

BuildCalendar(newYear, newMonth, newDay);
}
/// <summary>
/// 向后一个月
/// </summary>
public void NextMonth()
{
if (mCurrent.Year ==mYear && mCurrent.Month == mMonth)
{
BuildCalendar(mCurrent.Value.AddMonths(1));
return;
}
int newYear = mYear;
int newMonth = mMonth + 1;
int newDay = (mCurrent == null || mCurrent == NcCalendarDay.Empty) ? DateTime.Now.Day : mCurrent.Value.Day;

int maxMonthOfYear = CultureInfo.CurrentCulture.Calendar.GetMonthsInYear(newYear);
if (newMonth > maxMonthOfYear)
{
newYear++;
DateTime maxDate = CultureInfo.CurrentCulture.Calendar.MaxSupportedDateTime.Date;
if (newYear > maxDate.Year)
return;
newMonth = 1;
}

int maxDayOfMonth = CultureInfo.CurrentCulture.Calendar.GetDaysInMonth(newYear, newMonth);
if (newDay > maxDayOfMonth) newDay = maxDayOfMonth;

BuildCalendar(newYear, newMonth, newDay);
}
/// <summary>
/// 向前一个月
/// </summary>
public void PreviousMonth()
{
if (mCurrent.Year == mYear && mCurrent.Month == mMonth)
{
BuildCalendar(mCurrent.Value.AddMonths(-1));
return;
}

int newYear = mYear;
int newMonth = mMonth - 1;
int newDay = (mCurrent == null || mCurrent == NcCalendarDay.Empty) ? DateTime.Now.Day : mCurrent.Value.Day;

DateTime minDate = CultureInfo.CurrentCulture.Calendar.MinSupportedDateTime.Date;
if (newMonth < 1)
{
newYear = newYear - 1;
if (newYear < minDate.Year) return;
newMonth = CultureInfo.CurrentCulture.Calendar.GetMonthsInYear(newYear);
}

int maxDayOfMonth = CultureInfo.CurrentCulture.Calendar.GetDaysInMonth(newYear, newMonth);
if (newDay > maxDayOfMonth) newDay = maxDayOfMonth;

BuildCalendar(newYear, newMonth, newDay);

}
万小萌 2007-11-24
  • 打赏
  • 举报
回复
//////////////////////////NcCalendarControl.cs//////////////////////////////
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace TestMainWindow
{
public class NcCalendarControl : Control
{
#region 构造函数
static NcCalendarControl()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(NcCalendarControl), new FrameworkPropertyMetadata(typeof(NcCalendarControl)));
CommandManager.RegisterClassCommandBinding(typeof(NcCalendarControl), new CommandBinding(PreviousYear, OnPreviousYear));
CommandManager.RegisterClassCommandBinding(typeof(NcCalendarControl), new CommandBinding(PreviousMonth, OnPreviousMonth));
CommandManager.RegisterClassCommandBinding(typeof(NcCalendarControl), new CommandBinding(NextYear, OnNextYear));
CommandManager.RegisterClassCommandBinding(typeof(NcCalendarControl), new CommandBinding(NextMonth, OnNextMonth));
CommandManager.RegisterClassCommandBinding(typeof(NcCalendarControl), new CommandBinding(Today, OnToday));
}
public NcCalendarControl()
{
this.SetValue(ItemsProperty, new NcCalendar(DateTime.Now));
Items.SelectedChanged += new EventHandler(Items_SelectedChanged);
}
#endregion

#region 属性定义
/// <summary>
/// 本月的"周"集合
/// </summary>
public NcCalendar Items
{
get { return (NcCalendar)GetValue(ItemsProperty); }
set { SetValue(ItemsProperty, value); }
}
public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register("Items", typeof(NcCalendar), typeof(NcCalendarControl), new UIPropertyMetadata(new NcCalendar(DateTime.Now)));

#region Changeable
/// <summary>
/// 是否能够通过按钮改变年、月。
/// </summary>
public static readonly DependencyProperty ChangeableProperty = DependencyProperty.Register("Changeable", typeof(bool), typeof(NcCalendarControl), new FrameworkPropertyMetadata(true));
/// <summary>
/// 获取或设置Changeable
/// </summary>
public bool Changeable
{
get { return (bool)base.GetValue(NcCalendarControl.ChangeableProperty); }
set { base.SetValue(NcCalendarControl.ChangeableProperty, value); }
}
#endregion

#region ShowHeader
/// <summary>
/// 是否显示月历头。
/// </summary>
public static readonly DependencyProperty ShowHeaderProperty = DependencyProperty.Register("ShowHeader", typeof(bool), typeof(NcCalendarControl), new FrameworkPropertyMetadata(true));
/// <summary>
/// 获取或设置ShowHeader
/// </summary>
public bool ShowHeader
{
get { return (bool)base.GetValue(NcCalendarControl.ShowHeaderProperty); }
set { base.SetValue(NcCalendarControl.ShowHeaderProperty, value); }
}
#endregion

#region ShowWeekTitle
/// <summary>
/// 是否显示周标签。
/// </summary>
public static readonly DependencyProperty ShowWeekTitleProperty = DependencyProperty.Register("ShowWeekTitle", typeof(bool), typeof(NcCalendarControl), new FrameworkPropertyMetadata(true));
/// <summary>
/// 获取或设置ShowWeekTitle
/// </summary>
public bool ShowWeekTitle
{
get { return (bool)base.GetValue(NcCalendarControl.ShowWeekTitleProperty); }
set { base.SetValue(NcCalendarControl.ShowWeekTitleProperty, value); }
}
#endregion

#region CurrentDay
/// <summary>
/// 获取CurrentDay标识
/// </summary>
public static readonly DependencyPropertyKey CurrentDayPropertyKey = DependencyProperty.RegisterReadOnly("CurrentDay", typeof(DateTime), typeof(NcCalendarControl), new FrameworkPropertyMetadata(DateTime.Now.Date));
/// <summary>
/// 获取CurrentDay属性
/// </summary>
public static readonly DependencyProperty CurrentDayProperty = CurrentDayPropertyKey.DependencyProperty;
/// <summary>
/// 获取CurrentDay
/// </summary>
public DateTime CurrentDay { get { return (DateTime)base.GetValue(NcCalendarControl.CurrentDayProperty); } }
#endregion
#endregion

#region 事件定义
/// <summary>
/// 选项改变事件。
/// </summary>
public static readonly RoutedEvent SelectedChangedEvent = EventManager.RegisterRoutedEvent("SelectedChanged", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(NcCalendarControl));
public event RoutedEventHandler SelectedChanged
{
add { AddHandler(SelectedChangedEvent, value); }
remove { RemoveHandler(SelectedChangedEvent, value); }
}
void RaiseSelectedChangedEvent()
{
RoutedEventArgs args = new RoutedEventArgs(SelectedChangedEvent,this);
RaiseEvent(args);
}
#endregion

#region 命令定义
万小萌 2007-11-24
  • 打赏
  • 举报
回复
///////////////////////calendar--NcCalendar.cs/////////////////////
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Globalization;
using System.Collections.ObjectModel;

namespace TestMainWindow
{
public class NcCalendar : ObservableCollection<NcCalendarWeek>, INotifyPropertyChanged
{
#region 字段定义
private int mYear;
private int mMonth;
private NcCalendarDay mCurrent = NcCalendarDay.Empty;

#endregion
#region 事件定义
public event EventHandler SelectedChanged;
public event EventHandler CurrentChanged;
#endregion
#region 构造函数
public NcCalendar() : this(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day) { }
public NcCalendar(DateTime date) : this(date.Year, date.Month, date.Day) { }
public NcCalendar(int year, int month) : this(year, month, 1) { }
public NcCalendar(int year, int month, int day) { BuildCalendar(year, month, day); }
#endregion
#region 属性定义
public int Year
{
get { return mYear; }
set
{
int day = (mCurrent != null) ? day = mCurrent.Day : 1;
if (BuildCalendar(value, mMonth, day)) OnPropertyChanged(new PropertyChangedEventArgs("Year"));
}
}
public int Month
{
get { return mMonth; }
set
{
int day = (mCurrent != null) ? day = mCurrent.Day : 1;
if (BuildCalendar(mYear, value, day)) OnPropertyChanged(new PropertyChangedEventArgs("Month"));
}
}
public int Day
{
get { return mCurrent.Day; }
set { if (BuildCalendar(mYear, mMonth, value)) OnPropertyChanged(new PropertyChangedEventArgs("Day")); }
}

public NcCalendarDay Current
{
get { return mCurrent; }
set
{
if (value == null || value == NcCalendarDay.Empty || value == mCurrent || value.Value.Date == mCurrent.Value.Date) return;
bool setOK = false;
foreach (NcCalendarWeek week in this)
{
foreach (NcCalendarDay one in week)
{
if (one.IsEmpty) continue;
if (one.Value.Date == value.Value.Date)
{
mCurrent = one;
setOK = true;
OnPropertyChanged(new PropertyChangedEventArgs("Day"));
this.OnSelectedChanged(new EventArgs());
break;
}
}
if (setOK) break;
}
}
}
#endregion

#region 方法定义
public void SetValue(DateTime date) { BuildCalendar(date); }
/// <summary>
/// 向后一年
/// </summary>
public void NextYear()
{
if (mCurrent.Year == mYear && mCurrent.Month == mMonth)
{
BuildCalendar(mCurrent.Value.AddYears(1));
return;
}

int newYear = mYear + 1;
int newMonth = mMonth;
int newDay = (mCurrent==null || mCurrent == NcCalendarDay.Empty) ? DateTime.Now.Day : mCurrent.Value.Day;

DateTime maxDate = CultureInfo.CurrentCulture.Calendar.MaxSupportedDateTime.Date;
if (newYear > maxDate.Year) return;

int maxMonthOfYear = CultureInfo.CurrentCulture.Calendar.GetMonthsInYear(newYear);
if (newMonth > maxMonthOfYear) newMonth = maxMonthOfYear;
int maxDayOfMonth = CultureInfo.CurrentCulture.Calendar.GetDaysInMonth(newYear, newMonth);
if (newDay > maxDayOfMonth) newDay = maxDayOfMonth;

BuildCalendar(newYear, newMonth, newDay);
}
/// <summary>
/// 向前一年
/// </summary>
public void PreviousYear()
{
if (mCurrent.Year == mYear && mCurrent.Month == mMonth)
{
BuildCalendar(mCurrent.Value.AddYears(-1));
return;
}

int newYear = mYear - 1;
int newMonth = mMonth;
int newDay = (mCurrent == null || mCurrent == NcCalendarDay.Empty) ? DateTime.Now.Day : mCurrent.Value.Day;

DateTime minDate = CultureInfo.CurrentCulture.Calendar.MinSupportedDateTime.Date;
if (newYear < minDate.Year) return;

int maxMonthOfYear = CultureInfo.CurrentCulture.Calendar.GetMonthsInYear(newYear);
if (newMonth > maxMonthOfYear) newMonth = maxMonthOfYear;
int maxDayOfMonth = CultureInfo.CurrentCulture.Calendar.GetDaysInMonth(newYear, newMonth);
if (newDay > maxDayOfMonth) newDay = maxDayOfMonth;

BuildCalendar(newYear, newMonth, newDay);
}
/// <summary>
/// 向后一个月
/// </summary>
public void NextMonth()
{
if (mCurrent.Year ==mYear && mCurrent.Month == mMonth)
{
BuildCalendar(mCurrent.Value.AddMonths(1));
return;
}
int newYear = mYear;
int newMonth = mMonth + 1;
int newDay = (mCurrent == null || mCurrent == NcCalendarDay.Empty) ? DateTime.Now.Day : mCurrent.Value.Day;

int maxMonthOfYear = CultureInfo.CurrentCulture.Calendar.GetMonthsInYear(newYear);
if (newMonth > maxMonthOfYear)
{
newYear++;
DateTime maxDate = CultureInfo.CurrentCulture.Calendar.MaxSupportedDateTime.Date;
if (newYear > maxDate.Year)
return;
newMonth = 1;
}

int maxDayOfMonth = CultureInfo.CurrentCulture.Calendar.GetDaysInMonth(newYear, newMonth);
if (newDay > maxDayOfMonth) newDay = maxDayOfMonth;

BuildCalendar(newYear, newMonth, newDay);
}
/// <summary>
/// 向前一个月
/// </summary>
public void PreviousMonth()
{
if (mCurrent.Year == mYear && mCurrent.Month == mMonth)
{
BuildCalendar(mCurrent.Value.AddMonths(-1));
return;
}

int newYear = mYear;
int newMonth = mMonth - 1;
int newDay = (mCurrent == null || mCurrent == NcCalendarDay.Empty) ? DateTime.Now.Day : mCurrent.Value.Day;

DateTime minDate = CultureInfo.CurrentCulture.Calendar.MinSupportedDateTime.Date;
if (newMonth < 1)
{
newYear = newYear - 1;
if (newYear < minDate.Year) return;
newMonth = CultureInfo.CurrentCulture.Calendar.GetMonthsInYear(newYear);
}

int maxDayOfMonth = CultureInfo.CurrentCulture.Calendar.GetDaysInMonth(newYear, newMonth);
if (newDay > maxDayOfMonth) newDay = maxDayOfMonth;

BuildCalendar(newYear, newMonth, newDay);

}
万小萌 2007-11-24
  • 打赏
  • 举报
回复
///////////////////////calendar--NcCalendar.cs/////////////////////
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Globalization;
using System.Collections.ObjectModel;

namespace TestMainWindow
{
public class NcCalendar : ObservableCollection<NcCalendarWeek>, INotifyPropertyChanged
{
#region 字段定义
private int mYear;
private int mMonth;
private NcCalendarDay mCurrent = NcCalendarDay.Empty;

#endregion
#region 事件定义
public event EventHandler SelectedChanged;
public event EventHandler CurrentChanged;
#endregion
#region 构造函数
public NcCalendar() : this(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day) { }
public NcCalendar(DateTime date) : this(date.Year, date.Month, date.Day) { }
public NcCalendar(int year, int month) : this(year, month, 1) { }
public NcCalendar(int year, int month, int day) { BuildCalendar(year, month, day); }
#endregion
#region 属性定义
public int Year
{
get { return mYear; }
set
{
int day = (mCurrent != null) ? day = mCurrent.Day : 1;
if (BuildCalendar(value, mMonth, day)) OnPropertyChanged(new PropertyChangedEventArgs("Year"));
}
}
public int Month
{
get { return mMonth; }
set
{
int day = (mCurrent != null) ? day = mCurrent.Day : 1;
if (BuildCalendar(mYear, value, day)) OnPropertyChanged(new PropertyChangedEventArgs("Month"));
}
}
public int Day
{
get { return mCurrent.Day; }
set { if (BuildCalendar(mYear, mMonth, value)) OnPropertyChanged(new PropertyChangedEventArgs("Day")); }
}

public NcCalendarDay Current
{
get { return mCurrent; }
set
{
if (value == null || value == NcCalendarDay.Empty || value == mCurrent || value.Value.Date == mCurrent.Value.Date) return;
bool setOK = false;
foreach (NcCalendarWeek week in this)
{
foreach (NcCalendarDay one in week)
{
if (one.IsEmpty) continue;
if (one.Value.Date == value.Value.Date)
{
mCurrent = one;
setOK = true;
OnPropertyChanged(new PropertyChangedEventArgs("Day"));
this.OnSelectedChanged(new EventArgs());
break;
}
}
if (setOK) break;
}
}
}
#endregion

#region 方法定义
public void SetValue(DateTime date) { BuildCalendar(date); }
/// <summary>
/// 向后一年
/// </summary>
public void NextYear()
{
if (mCurrent.Year == mYear && mCurrent.Month == mMonth)
{
BuildCalendar(mCurrent.Value.AddYears(1));
return;
}

int newYear = mYear + 1;
int newMonth = mMonth;
int newDay = (mCurrent==null || mCurrent == NcCalendarDay.Empty) ? DateTime.Now.Day : mCurrent.Value.Day;

DateTime maxDate = CultureInfo.CurrentCulture.Calendar.MaxSupportedDateTime.Date;
if (newYear > maxDate.Year) return;

int maxMonthOfYear = CultureInfo.CurrentCulture.Calendar.GetMonthsInYear(newYear);
if (newMonth > maxMonthOfYear) newMonth = maxMonthOfYear;
int maxDayOfMonth = CultureInfo.CurrentCulture.Calendar.GetDaysInMonth(newYear, newMonth);
if (newDay > maxDayOfMonth) newDay = maxDayOfMonth;

BuildCalendar(newYear, newMonth, newDay);
}
/// <summary>
/// 向前一年
/// </summary>
public void PreviousYear()
{
if (mCurrent.Year == mYear && mCurrent.Month == mMonth)
{
BuildCalendar(mCurrent.Value.AddYears(-1));
return;
}

int newYear = mYear - 1;
int newMonth = mMonth;
int newDay = (mCurrent == null || mCurrent == NcCalendarDay.Empty) ? DateTime.Now.Day : mCurrent.Value.Day;

DateTime minDate = CultureInfo.CurrentCulture.Calendar.MinSupportedDateTime.Date;
if (newYear < minDate.Year) return;

int maxMonthOfYear = CultureInfo.CurrentCulture.Calendar.GetMonthsInYear(newYear);
if (newMonth > maxMonthOfYear) newMonth = maxMonthOfYear;
int maxDayOfMonth = CultureInfo.CurrentCulture.Calendar.GetDaysInMonth(newYear, newMonth);
if (newDay > maxDayOfMonth) newDay = maxDayOfMonth;

BuildCalendar(newYear, newMonth, newDay);
}
/// <summary>
/// 向后一个月
/// </summary>
public void NextMonth()
{
if (mCurrent.Year ==mYear && mCurrent.Month == mMonth)
{
BuildCalendar(mCurrent.Value.AddMonths(1));
return;
}
int newYear = mYear;
int newMonth = mMonth + 1;
int newDay = (mCurrent == null || mCurrent == NcCalendarDay.Empty) ? DateTime.Now.Day : mCurrent.Value.Day;

int maxMonthOfYear = CultureInfo.CurrentCulture.Calendar.GetMonthsInYear(newYear);
if (newMonth > maxMonthOfYear)
{
newYear++;
DateTime maxDate = CultureInfo.CurrentCulture.Calendar.MaxSupportedDateTime.Date;
if (newYear > maxDate.Year)
return;
newMonth = 1;
}

int maxDayOfMonth = CultureInfo.CurrentCulture.Calendar.GetDaysInMonth(newYear, newMonth);
if (newDay > maxDayOfMonth) newDay = maxDayOfMonth;

BuildCalendar(newYear, newMonth, newDay);
}
/// <summary>
/// 向前一个月
/// </summary>
public void PreviousMonth()
{
if (mCurrent.Year == mYear && mCurrent.Month == mMonth)
{
BuildCalendar(mCurrent.Value.AddMonths(-1));
return;
}

int newYear = mYear;
int newMonth = mMonth - 1;
int newDay = (mCurrent == null || mCurrent == NcCalendarDay.Empty) ? DateTime.Now.Day : mCurrent.Value.Day;

DateTime minDate = CultureInfo.CurrentCulture.Calendar.MinSupportedDateTime.Date;
if (newMonth < 1)
{
newYear = newYear - 1;
if (newYear < minDate.Year) return;
newMonth = CultureInfo.CurrentCulture.Calendar.GetMonthsInYear(newYear);
}

int maxDayOfMonth = CultureInfo.CurrentCulture.Calendar.GetDaysInMonth(newYear, newMonth);
if (newDay > maxDayOfMonth) newDay = maxDayOfMonth;

BuildCalendar(newYear, newMonth, newDay);

}
万小萌 2007-11-17
  • 打赏
  • 举报
回复
////////////////////////////////Common--TRMSConfiguration//////////////////////////////
using System;
using System.Configuration;
using Thinkbank.Utility.CryptTo;

namespace Thinkbank.TRMS.Common
{
/// <summary>
/// TBOAConfiguration 的摘要说明。
/// </summary>
public class TRMSConfiguration
{
public TRMSConfiguration()
{
}

/// <summary>
/// 连接字符串
/// </summary>
public static string ConnectionString = ConfigurationSettings.AppSettings["TRMS.Core.ConnectionString"];
public static string ConnectionString1 = ConfigurationSettings.AppSettings["TRS.Core.ConnectionString"];

/// <summary>
/// 数据访问层程序集
/// </summary>
public static string DALAssembly = ConfigurationSettings.AppSettings["TRMS.Core.DALAssembly"];

/// <summary>
/// 数据访问层命名空间
/// </summary>
public static string DALNameSpace = ConfigurationSettings.AppSettings["TRMS.Core.DALNameSpace"];

/// <summary>
/// 系统Session 和 Cookie的前缀
/// </summary>
public static string Prefix = ConfigurationSettings.AppSettings["TRMS.Core.Prefix"];

/// <summary>
/// 系统日志的源
/// </summary>
public static string LogSource = ConfigurationSettings.AppSettings["TRMS.Core.LogSource"];

/// <summary>
/// 加密使用的Key
/// </summary>
public static string Secret = ConfigurationSettings.AppSettings["TRMS.Core.Secret"];

/// <summary>
/// 3DES加密使用的Key
/// </summary>
public static string TripleDESKey = CryptTo.GenerateKey(Secret);

/// <summary>
/// 用来保存用户Cookie的名称
/// </summary>
public static string LoginCookieName = ConfigurationSettings.AppSettings["TRMS.Core.LoginCookieName"];

/// <summary>
/// 登录页面的地址
/// </summary>
public static string LoginPageURL = ConfigurationSettings.AppSettings["TRMS.Core.LoginPage"];

/// <summary>
/// 页面缓存时间(单位:秒)
/// </summary>
public static string PageExpires = ConfigurationSettings.AppSettings["TRMS.Core.PageExpires"];
}
}
万小萌 2007-11-17
  • 打赏
  • 举报
回复
{
if(i != 0)
strRightIDs += ",";
strRightIDs += rightIDs[i].ToString();
}
strSQL.Append(" AND (RightID IN(" + strRightIDs + "))");

object obj = SqlHelper.ExecuteScalar(TRMSConfiguration.ConnectionString, CommandType.Text, strSQL.ToString(), parm);
int RecordCount = Convert.ToInt32(obj);

if(RecordCount > 0)
return true;
else
return false;
}

#endregion
}
}
万小萌 2007-11-17
  • 打赏
  • 举报
回复
StringBuilder strSQL = new StringBuilder();

//准备更新用户和删除用户角色的Sql语句和参数
strSQL.Append(SQL_UPDATE_PASSWORD);

SqlParameter[] parms = new SqlParameter[2];
parms[0] = new SqlParameter(PARM_PASSWORD,SqlDbType.VarChar,64);
parms[0].Value = newPassword;
parms[1] = new SqlParameter(PARM_USER_ID,SqlDbType.Int);
parms[1].Value = userID;

//执行命令成功则返回true,失败则返回false
SqlConnection connection = null;
try
{
connection = GetConnection(TRMSConfiguration.ConnectionString);
SqlHelper.ExecuteNonQuery(connection, CommandType.Text, strSQL.ToString(), parms);
}
catch
{
return new ReturnInfo(false, "系统操作数据库失败!");
}
finally
{
if(connection != null)
connection.Dispose();
}

return new ReturnInfo(true,null);
}

/// <summary>
/// 判断是否存在指定登录名的用户
/// </summary>
/// <param name="loginName">登录名</param>
/// <returns>存在则返回true,否则返回false</returns>
public bool IsExistUser(string loginName)
{
StringBuilder strSQL = new StringBuilder();

strSQL.Append(SQL_IS_EXIST_USER);

SqlParameter parm = new SqlParameter(PARM_LOGIN_NAME, SqlDbType.VarChar, 16);
parm.Value = loginName;

object obj = SqlHelper.ExecuteScalar(TRMSConfiguration.ConnectionString,CommandType.Text,strSQL.ToString(),parm);
int count = Convert.ToInt32(obj);

if(count>0)
return true;
else
return false;
}

/// <summary>
/// 检查用户的权限
/// </summary>
/// <param name="userID">用户ID</param>
/// <param name="rightID">权限ID</param>
/// <returns>如果用户具有该权限则返回true,否则返回false</returns>
public bool CheckRight(int userID, int rightID)
{
StringBuilder strSQL = new StringBuilder();

strSQL.Append(SQL_CHECK_RIGHT);

SqlParameter[] parms = new SqlParameter[2];
parms[0] = new SqlParameter(PARM_USER_ID,SqlDbType.Int);
parms[0].Value = userID;
parms[1] = new SqlParameter(PARM_RIGHT_ID,SqlDbType.Int);
parms[1].Value = rightID;

object obj = SqlHelper.ExecuteScalar(TRMSConfiguration.ConnectionString, CommandType.Text, strSQL.ToString(), parms);
int RecordCount = Convert.ToInt32(obj);

if(RecordCount > 0)
return true;
else
return false;

}

/// <summary>
/// 检查用户的权限
/// </summary>
/// <param name="userID">用户ID</param>
/// <param name="rightIDs">一组权限</param>
/// <returns>如果用户具有该组权限中的一个则返回true,否则返回false</returns>
public bool CheckRight(int userID, int[] rightIDs)
{
StringBuilder strSQL = new StringBuilder();

strSQL.Append(SQL_CHECK_RIGHT_2);

SqlParameter parm = new SqlParameter(PARM_USER_ID,SqlDbType.Int);
parm.Value = userID;

int len = rightIDs.Length;
string strRightIDs = string.Empty;
for(int i=0; i<len; i++)
万小萌 2007-11-17
  • 打赏
  • 举报
回复
}
finally
{
if(connection != null)
connection.Dispose();
}

return new ReturnInfo(true,null);
}

/// <summary>
/// 删除一批用户
/// </summary>
/// <param name="userIDs">用户ID的集合</param>
/// <returns>操作的返回信息</returns>
public ReturnInfo Delete(int[] userIDs)
{
StringBuilder strSQL = new StringBuilder();

int len = userIDs.Length;
string strUserIDs = string.Empty;
for(int i=0; i<len; i++)
{
if(i != 0)
strUserIDs += ",";
strUserIDs += userIDs[i].ToString();
}

strSQL.Append(SQL_DELETE_USER_ROLE_2).Append(" WHERE UserID IN(" + strUserIDs + "); ");
strSQL.Append(SQL_DELETE_USER_2).Append(" WHERE UserID IN(" + strUserIDs + "); ");


//执行命令成功则返回true,失败则返回false
SqlConnection connection = null;
try
{
connection = GetConnection(TRMSConfiguration.ConnectionString);
using(SqlTransaction trans = connection.BeginTransaction())
{
try
{
SqlHelper.ExecuteNonQuery(trans, CommandType.Text, strSQL.ToString(), null);
trans.Commit();
}
catch(Exception ex)
{
trans.Rollback();
throw ex;
}
}
}
catch
{
return new ReturnInfo(false,"系统操作数据库失败!");
}
finally
{
if(connection != null)
connection.Dispose();
}

return new ReturnInfo(true,null);
}

/// <summary>
/// 取用户密码
/// </summary>
/// <param name="userID">用户ID</param>
/// <returns>取得的用户密码</returns>
public string GetUserPassword(int userID)
{
string pwd = null;

SqlParameter parm = new SqlParameter(PARM_USER_ID,SqlDbType.Int);
parm.Value = userID;

//取得该用户的信息
using(SqlDataReader rdr = SqlHelper.ExecuteReader(TRMSConfiguration.ConnectionString, CommandType.Text, SQL_SELECT_USER, parm))
{
if(rdr.Read())
{
pwd = rdr.GetString(2).ToString();
}
else
{
pwd = null;
}
}

return pwd;
}

/// <summary>
/// 修改用户密码
/// </summary>
/// <param name="userID">用户ID</param>
/// <param name="newPassword">新密码</param>
/// <returns>操作的返回信息</returns>
public ReturnInfo ChangeUserPassword(int userID, string newPassword)
{
加载更多回复(38)

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧